/ Hex Artifact Content
Login

Artifact 6ea1cb2f0ab80a5bbaa603c872658c0237d4997d24a455e9b025d74ea08a4615:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
1000: 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
1010: 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53  e->db,TK_ASTERIS
1020: 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  K,0));.  }.  pNe
1030: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  w->pEList = pELi
1040: 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  st;.  pNew->op =
1050: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e   TK_SELECT;.  pN
1060: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73  ew->selFlags = s
1070: 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  elFlags;.  pNew-
1080: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
1090: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
10a0: 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
10b0: 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e 65 77  E_ENABLED.  pNew
10c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20  ->zSelName[0] = 
10d0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65 77  0;.#endif.  pNew
10e0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
10f0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1100: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
1110: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  = -1;.  pNew->nS
1120: 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
1130: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1140: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1150: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
1160: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 53 72  >db, sizeof(*pSr
1170: 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  c));.  pNew->pSr
1180: 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77  c = pSrc;.  pNew
1190: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
11a0: 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  e;.  pNew->pGrou
11b0: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
11c0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
11d0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65  = pHaving;.  pNe
11e0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  w->pOrderBy = pO
11f0: 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  rderBy;.  pNew->
1200: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  pPrior = 0;.  pN
1210: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ew->pNext = 0;. 
1220: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
1230: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
1240: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1250: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  t;.  pNew->pWith
1260: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1270: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
1280: 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  imit!=0 || pPars
1290: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 50 61  e->nErr>0 || pPa
12a0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
12b0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
12c0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
12d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
12e0: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70     clearSelect(p
12f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c  Parse->db, pNew,
1300: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29   pNew!=&standin)
1310: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1330: 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21  ert( pNew->pSrc!
1340: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
1350: 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  rr>0 );.  }.  as
1360: 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61  sert( pNew!=&sta
1370: 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e  ndin );.  return
1380: 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45   pNew;.}..#if SE
1390: 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
13a0: 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  D./*.** Set the 
13b0: 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74  name of a Select
13c0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
13d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
13e0: 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20  Name(Select *p, 
13f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1400: 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a  e){.  if( p && z
1410: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1420: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1430: 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29  eof(p->zSelName)
1440: 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22  , p->zSelName, "
1450: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
1460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1470: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
1480: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
1490: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
14a0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
14b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
14d0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
14e0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
14f0: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
1500: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
1510: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1520: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
1530: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
1540: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
1550: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1560: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1570: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1580: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1590: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
15a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
15b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
15c0: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
15d0: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
15e0: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
15f0: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
1600: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
1610: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
1620: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
1630: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
1640: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1660: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1670: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1680: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1690: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
16a0: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
16b0: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
16c0: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
16d0: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
16e0: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
16f0: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
1700: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
1710: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
1720: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
1730: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
1740: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
1750: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1760: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1770: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1780: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1790: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17a0: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
17b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
17c0: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
17d0: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
17e0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
17f0: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
1800: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1830: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
1840: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1850: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1860: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1870: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1880: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1890: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
18a0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
18b0: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
18c0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
18d0: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
18e0: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
18f0: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
1900: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
1910: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
1920: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
1930: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
1940: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
1950: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1960: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1970: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1980: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1990: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
19a0: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
19b0: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
19c0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
19e0: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
19f0: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1a10: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
1a20: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
1a30: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
1a50: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1a60: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1a70: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1a80: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1a90: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1ab0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1ac0: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1ae0: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1af0: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
1b00: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
1b10: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
1b20: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
1b30: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
1b40: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
1b50: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1b60: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1b70: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1b80: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1b90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1ba0: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1bb0: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1bc0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1bd0: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1be0: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1bf0: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1c10: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
1c20: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
1c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c40: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1c50: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
1c60: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
1c70: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
1c80: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
1c90: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
1ca0: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
1cb0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1cc0: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
1cd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ce0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
1cf0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
1d00: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
1d10: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1d20: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
1d30: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
1d40: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
1d50: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
1d60: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
1d70: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
1d80: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
1d90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1da0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1db0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1dc0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1dd0: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
1de0: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
1df0: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
1e00: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1e10: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
1e20: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1e30: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
1e40: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
1e50: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
1e60: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1e80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1e90: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1ea0: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1eb0: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1ec0: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1ed0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1ee0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1ef0: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1f00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1f10: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1f20: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1f30: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1f40: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1f50: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1f60: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1f70: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1f80: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1f90: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1fa0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1fb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1fc0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1fe0: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1ff0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
2000: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
2010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
2020: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2030: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
2040: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
2050: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
2060: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
2070: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
2080: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
2090: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
20a0: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
20b0: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
20c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
20d0: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
20e0: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
20f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
2100: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
2110: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
2120: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
2130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
2140: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
2150: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2160: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2170: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2180: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2190: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
21a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
21b0: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
21c0: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
21d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
21e0: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
21f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
2200: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
2210: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2230: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
2240: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
2250: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2260: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2270: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2280: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2290: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
22a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
22b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22c0: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
22d0: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
22e0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
22f0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2300: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
2310: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
2320: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
2330: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
2340: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
2350: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2360: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2370: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2380: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2390: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
23a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
23b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
23c0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
23d0: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
23e0: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
23f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2400: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2430: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2440: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
2450: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2460: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2470: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2480: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2490: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
24a0: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
24b0: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
24c0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
24d0: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
24e0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
24f0: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
2500: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
2510: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
2520: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
2530: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
2540: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
2550: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2560: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2570: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2580: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2590: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
25a0: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
25b0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
25c0: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
25d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
2600: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2610: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2630: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
2640: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2650: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2680: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2690: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
26a0: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
26d0: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2710: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
2720: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2730: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
2740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2750: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2760: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2770: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2780: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
27b0: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
27c0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
27d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
27e0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
27f0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
2800: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2810: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2820: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
2830: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
2840: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
2850: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2870: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2890: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
28a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
28b0: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
28c0: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
28d0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
28e0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
28f0: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
2900: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
2910: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2920: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
2930: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
2940: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
2950: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2960: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a  _EQ, pE1, pE2);.
2970: 20 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f    if( pEq && isO
2980: 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  uterJoin ){.    
2990: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
29a0: 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  pEq, EP_FromJoin
29b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
29c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29d0: 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  pEq, EP_TokenOnl
29e0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
29f0: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2a20: 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  Eq->iRightJoinTa
2a30: 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e  ble = (i16)pE2->
2a40: 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  iTable;.  }.  *p
2a50: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2a60: 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57  ExprAnd(db, *ppW
2a70: 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f  here, pEq);.}../
2a80: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
2a90: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2aa0: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
2ab0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
2ac0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
2ad0: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
2ae0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
2af0: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
2b00: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
2b10: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2b20: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
2b30: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
2b40: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
2b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
2b60: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
2b70: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
2b80: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
2b90: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
2ba0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
2bb0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
2bc0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
2bd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2be0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
2bf0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
2c00: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
2c10: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
2c20: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
2c30: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
2c40: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
2c50: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
2c60: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
2c70: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
2c80: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
2c90: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2ca0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
2cb0: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
2cc0: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
2cd0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2ce0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
2cf0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2d00: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
2d10: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
2d20: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
2d30: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
2d40: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
2d50: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
2d60: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
2d70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
2d80: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
2d90: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
2da0: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
2db0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
2dc0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
2dd0: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
2de0: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
2df0: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
2e00: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2e10: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
2e20: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
2e30: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
2e40: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
2e50: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
2e60: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
2e70: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
2e80: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
2e90: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
2ea0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
2eb0: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
2ec0: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
2ed0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
2ee0: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
2ef0: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
2f00: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
2f10: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
2f20: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
2f30: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
2f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2f50: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
2f60: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
2f70: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
2f80: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2f90: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
2fa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2fb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2fc0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
2fd0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2fe0: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2ff0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
3000: 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52  duce);.    p->iR
3010: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
3020: 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20  (i16)iTable;.   
3030: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3040: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3050: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3060: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3070: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3080: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3090: 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45          setJoinE
30a0: 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  xpr(p->x.pList->
30b0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
30c0: 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
30d0: 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78   }.    setJoinEx
30e0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
30f0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
3100: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3110: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3120: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3130: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3140: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3150: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3160: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3170: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3180: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3190: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
31a0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
31b0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
31c0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
31d0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
31e0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
31f0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
3200: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3210: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3220: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3230: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3240: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3250: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3260: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3270: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3280: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3290: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
32a0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
32b0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
32c0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
32d0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
32e0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
32f0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
3300: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3310: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3320: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3330: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3340: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3350: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3360: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3370: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3380: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3390: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
33a0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
33b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33c0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
33d0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
33e0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
33f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3420: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3430: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3460: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3470: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3480: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3490: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
34a0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
34b0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
34c0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
34d0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
34e0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
34f0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3500: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3510: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3520: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3530: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3540: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3550: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3560: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
3570: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
3580: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
3590: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
35a0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
35b0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
35c0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
35d0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
35e0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
35f0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3600: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3610: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3620: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3630: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3640: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3650: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3660: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3670: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3680: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3690: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
36a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36b0: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
36c0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
36d0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
36e0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
36f0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3710: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3720: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3730: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3740: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3750: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3760: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3770: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3780: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3790: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
37a0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
37b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
37c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
37d0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
37e0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
37f0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3800: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3810: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3820: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3830: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3840: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3850: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3860: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3870: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3880: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3890: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
38a0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
38b0: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
38c0: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
38d0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
38e0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
38f0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3900: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3930: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3950: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3960: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3970: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3980: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3990: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
39a0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
39b0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
39c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
39d0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
39e0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
39f0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3a00: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3a10: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3a20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3a30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
3a40: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
3a50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3a60: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
3a70: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
3a80: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
3a90: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
3aa0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
3ab0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
3ac0: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
3ad0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
3ae0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
3af0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
3b00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
3b10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3b20: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
3b30: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
3b40: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
3b50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
3b60: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
3b70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3b80: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
3b90: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
3ba0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
3bb0: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
3bc0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3bd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
3be0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
3bf0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
3c00: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
3c10: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
3c20: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
3c30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3c40: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
3c50: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
3c60: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
3c70: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
3c80: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
3c90: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
3ca0: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
3cb0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
3cc0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
3cd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
3ce0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3cf0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3d00: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
3d10: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
3d20: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
3d30: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
3d40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
3d60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3d70: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
3d80: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
3d90: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3da0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
3db0: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
3dc0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
3dd0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
3de0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
3df0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
3e00: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
3e10: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
3e20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3e30: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
3e40: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3e50: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3e60: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
3e70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
3e80: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
3ea0: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
3eb0: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
3ec0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
3ed0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
3ee0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
3ef0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
3f00: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
3f10: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
3f20: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
3f30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3f40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3f50: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
3f60: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
3f70: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
3f80: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
3f90: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
3fa0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
3fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fd0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3fe0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3ff0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
4000: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4030: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4050: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
4060: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
4070: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
4080: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
4090: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
40a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
40b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
40c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
40d0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
40e0: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
40f0: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
4100: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
4110: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
4120: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
4130: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
4140: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
4150: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
4160: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
4170: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
4180: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a  o the end */.);.
4190: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
41a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70  code that will p
41b0: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69  ush the record i
41c0: 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44  n registers regD
41d0: 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72  ata.** through r
41e0: 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f  egData+nData-1 o
41f0: 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a  nto the sorter..
4200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4210: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
4220: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4230: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
4240: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
4250: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
4260: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4270: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f  tion about the O
4280: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
4290: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
42a0: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
42b0: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
42c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
42d0: 74 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20  t regData,      
42e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
42f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4300: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
4310: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
4320: 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20  gData,       /* 
4330: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4340: 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f  olding data befo
4350: 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20  re packing */.  
4360: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
4370: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4380: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
4390: 74 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a  the data array *
43a0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
43b0: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
43c0: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
43d0: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
43e0: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
43f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4400: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4430: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4440: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
4450: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
4460: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4470: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
4480: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
4490: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
44a0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
44b0: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
44c0: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
44d0: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
44e0: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
4510: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4520: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
4560: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4570: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
4580: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
45b0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
45c0: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
45d0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
4600: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
4610: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
4640: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
4650: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
4660: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
4690: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
46a0: 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62  rt( bSeq==0 || b
46b0: 53 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Seq==1 );.  asse
46c0: 72 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20  rt( nData==1 || 
46d0: 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67  regData==regOrig
46e0: 44 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44  Data || regOrigD
46f0: 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
4700: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
4710: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
4720: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
4730: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
4740: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70  = regData - nExp
4750: 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73  r - bSeq;.  }els
4760: 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  e{.    regBase =
4770: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
4780: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
4790: 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20  Mem += nBase;.  
47a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  }.  assert( pSel
47b0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20  ect->iOffset==0 
47c0: 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  || pSelect->iLim
47d0: 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69  it!=0 );.  iLimi
47e0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  t = pSelect->iOf
47f0: 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e  fset ? pSelect->
4800: 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c  iOffset+1 : pSel
4810: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70  ect->iLimit;.  p
4820: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20  Sort->labelDone 
4830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4840: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c  eLabel(v);.  sql
4850: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4860: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
4870: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65  rt->pOrderBy, re
4880: 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61  gBase, regOrigDa
4890: 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
48b0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20  LITE_ECEL_DUP | 
48c0: 28 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51  (regOrigData? SQ
48d0: 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20  LITE_ECEL_REF : 
48e0: 30 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20  0));.  if( bSeq 
48f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4900: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
4910: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
4920: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4930: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  e+nExpr);.  }.  
4940: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  if( nPrefixReg==
4950: 30 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a  0 && nData>0 ){.
4960: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4970: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
4980: 72 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65  regData, regBase
4990: 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61  +nExpr+bSeq, nDa
49a0: 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ta);.  }.  sqlit
49b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
49c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
49d0: 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e  egBase+nOBSat, n
49e0: 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67  Base-nOBSat, reg
49f0: 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e  Record);.  if( n
4a00: 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69  OBSat>0 ){.    i
4a10: 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20  nt regPrevKey;  
4a20: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f   /* The first nO
4a30: 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  BSat columns of 
4a40: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
4a50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4a60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64  First;    /* Add
4a70: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49  ress of the OP_I
4a80: 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  fNot opcode */. 
4a90: 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20     int addrJmp; 
4aa0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4ab0: 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f  of the OP_Jump o
4ac0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62  pcode */.    Vdb
4ad0: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f  eOp *pOp;      /
4ae0: 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70  * Opcode that op
4af0: 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a  ens the sorter *
4b00: 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20  /.    int nKey; 
4b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b20: 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79  r of sorting key
4b30: 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64   columns, includ
4b40: 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20  ing OP_Sequence 
4b50: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
4b60: 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  pKI;     /* Orig
4b70: 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20  inal KeyInfo on 
4b80: 74 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65  the sorter table
4b90: 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76   */..    regPrev
4ba0: 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Key = pParse->nM
4bb0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
4bc0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d  ->nMem += pSort-
4bd0: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65  >nOBSat;.    nKe
4be0: 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72  y = nExpr - pSor
4bf0: 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71  t->nOBSat + bSeq
4c00: 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29  ;.    if( bSeq )
4c10: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
4c20: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
4c30: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
4c40: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  t, regBase+nExpr
4c50: 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ); .    }else{. 
4c60: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
4c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c80: 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p1(v, OP_Sequenc
4c90: 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45  eTest, pSort->iE
4ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
4cb0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4cc0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4cd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4ce0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76  Compare, regPrev
4cf0: 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53  Key, regBase, pS
4d00: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4d10: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
4d20: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
4d30: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
4d40: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
4d50: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4d60: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
4d70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79    pOp->p2 = nKey
4d80: 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b   + nData;.    pK
4d90: 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  I = pOp->p4.pKey
4da0: 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Info;.    memset
4db0: 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72  (pKI->aSortOrder
4dc0: 2c 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69  , 0, pKI->nKeyFi
4dd0: 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f  eld); /* Makes O
4de0: 50 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20  P_Jump testable 
4df0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
4e00: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
4e10: 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34  , (char*)pKI, P4
4e20: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74  _KEYINFO);.    t
4e30: 65 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41  estcase( pKI->nA
4e40: 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e  llField > pKI->n
4e50: 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20  KeyField+2 );.  
4e60: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
4e70: 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
4e80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4e90: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4ea0: 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20  , nOBSat,.      
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69       pKI->nAllFi
4ee0: 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65  eld-pKI->nKeyFie
4ef0: 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a  ld-1);.    addrJ
4f00: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
4f10: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
4f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
4f40: 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20  , addrJmp+1, 0, 
4f50: 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65  addrJmp+1); Vdbe
4f60: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4f70: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
4f80: 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ut = sqlite3Vdbe
4f90: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4fa0: 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75    pSort->regRetu
4fb0: 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
4fc0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
4fd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4fe0: 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72  _Gosub, pSort->r
4ff0: 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  egReturn, pSort-
5000: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
5010: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5020: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
5030: 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45  orter, pSort->iE
5040: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
5050: 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20   iLimit ){.     
5060: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5070: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
5080: 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c  iLimit, pSort->l
5090: 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20  abelDone);.     
50a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
50b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
50c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
50d0: 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20  v, addrFirst);. 
50e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
50f0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
5100: 65 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b  egBase, regPrevK
5110: 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  ey, pSort->nOBSa
5120: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
5130: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
5140: 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69  ddrJmp);.  }.  i
5150: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
5160: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
5170: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
5180: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
5190: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
51a0: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
51b0: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
51c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
51d0: 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69  (v, op, pSort->i
51e0: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
51f0: 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
5200: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61             regBa
5210: 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65  se+nOBSat, nBase
5220: 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20  -nOBSat);.  if( 
5230: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
5240: 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20  t addr;.    int 
5250: 72 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46  r1 = 0;.    /* F
5260: 69 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75  ill the sorter u
5270: 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
5280: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e   LIMIT+OFFSET en
5290: 74 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69  tries.  (The iLi
52a0: 6d 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73  mit.    ** regis
52b0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
52c0: 65 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66  ed with value of
52d0: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20   LIMIT+OFFSET.) 
52e0: 20 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65   After the sorte
52f0: 72 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75  r.    ** fills u
5300: 70 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65  p, delete the le
5310: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
5320: 20 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61   sorter after ea
5330: 63 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a  ch insert..    *
5340: 2a 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20  * Thus we never 
5350: 68 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74  hold more than t
5360: 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  he LIMIT+OFFSET 
5370: 72 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61  rows in memory a
5380: 74 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64  t once */.    ad
5390: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
53a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
53b0: 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  otZero, iLimit);
53c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
53d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
53e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
53f0: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5400: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53  sor);.    if( pS
5410: 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  ort->bOrderedInn
5420: 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  erLoop ){.      
5430: 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
5440: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
5450: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5460: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74  OP_Column, pSort
5470: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70  ->iECursor, nExp
5480: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  r, r1);.      Vd
5490: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
54a0: 65 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eq"));.    }.   
54b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
54c0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
54d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
54e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  );.    if( pSort
54f0: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
5500: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  oop ){.      /* 
5510: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
5520: 70 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61  p is driven by a
5530: 6e 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61  n index such tha
5540: 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20  t values from.  
5550: 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
5560: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
5570: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20   inner loop are 
5580: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c  in sorted order,
5590: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69   then.      ** i
55a0: 6d 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20  mmediately jump 
55b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
55c0: 61 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65  ation of an inne
55d0: 72 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20  r loop if the.  
55e0: 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f      ** entry fro
55f0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74  m the current it
5600: 65 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  eration does not
5610: 20 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f   fit into the to
5620: 70 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54  p.      ** LIMIT
5630: 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20  +OFFSET entries 
5640: 6f 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  of the sorter. *
5650: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b  /.      int iBrk
5660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
5670: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
5680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5690: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
56a0: 45 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  Eq, regBase+nExp
56b0: 72 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20  r, iBrk, r1);.  
56c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
56d0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
56e0: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
56f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5710: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5720: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
5730: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
5740: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
5750: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
5760: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
5770: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
5780: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
5790: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
57a0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  s VM */.  int iO
57b0: 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52  ffset,      /* R
57c0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
57d0: 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74  the offset count
57e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  er */.  int iCon
57f0: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
5800: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
5810: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
5820: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f  d */.){.  if( iO
5830: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73  ffset>0 ){.    s
5840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5850: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
5860: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5870: 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 1); VdbeCovera
5880: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
5890: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
58a0: 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ET"));.  }.}../*
58b0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
58c0: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
58d0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
58e0: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
58f0: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
5900: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
5910: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
5920: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
5930: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
5940: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
5950: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
5960: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
5970: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
5980: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
5990: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
59a0: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
59b0: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
59c0: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
59d0: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
59e0: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
59f0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5a00: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5a10: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
5a20: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
5a30: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
5a40: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
5a50: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
5a60: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
5a70: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
5a80: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
5a90: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5aa0: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5ab0: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5ac0: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5ad0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5ae0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5af0: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5b00: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5b20: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
5b30: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
5b40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
5b50: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
5b60: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
5b70: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
5b80: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5b90: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5ba0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5bc0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5bd0: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5be0: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5bf0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5c10: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5c20: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
5c30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c40: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
5c50: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c  nsert, iTab, r1,
5c60: 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c   iMem, N);.  sql
5c70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
5c80: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
5c90: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
5ca0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5cb0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
5cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5cd0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
5ce0: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
5cf0: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
5d00: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
5d10: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
5d20: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
5d30: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
5d40: 70 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73  p->pEList expres
5d50: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
5d60: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
5d70: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
5d80: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
5d90: 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a  f srcTab is.** z
5da0: 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65  ero or more, the
5db0: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
5dc0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
5dd0: 20 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73   p->pEList is us
5de0: 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67  ed only .** to g
5df0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
5e00: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
5e10: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
5e20: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
5e30: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
5e40: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
5e50: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
5e60: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
5e70: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
5e80: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
5e90: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5ea0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
5eb0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5ec0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
5ed0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5ef0: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
5f00: 69 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d  is table if non-
5f10: 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f  negative */.  So
5f20: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
5f30: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
5f40: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
5f50: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44  w to process ORD
5f60: 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69  ER BY */.  Disti
5f70: 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63  nctCtx *pDistinc
5f80: 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c  t, /* If not NUL
5f90: 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  L, info on how t
5fa0: 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e  o process DISTIN
5fb0: 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  CT */.  SelectDe
5fc0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
5fd0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
5fe0: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
5ff0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
6000: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
6010: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
6020: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
6030: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
6040: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
6050: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
6060: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
6070: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
6080: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
6090: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
60a0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
60b0: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
60c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
60d0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
60e0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
60f0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
6100: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20  = pDest->eDest; 
6110: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
6120: 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a  ose of results *
6130: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  /.  int iParm = 
6140: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20  pDest->iSDParm; 
6150: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
6160: 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65  t to disposal me
6170: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  thod */.  int nR
6180: 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20  esultCol;       
6190: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
61a0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
61b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  s */.  int nPref
61c0: 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  ixReg = 0;      
61d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
61e0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
61f0: 62 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74  before regResult
6200: 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c   */..  /* Usuall
6210: 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73 20  y, regResult is 
6220: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69  the first cell i
6230: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65  n an array of me
6240: 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  mory cells.  ** 
6250: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
6260: 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f  urrent result ro
6270: 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  w. In this case 
6280: 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74  regOrig is set t
6290: 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  o the.  ** same 
62a0: 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20  value. However, 
62b0: 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
62c0: 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  re being sent to
62d0: 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65   the sorter, the
62e0: 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72  .  ** values for
62f0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73   any expressions
6300: 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70   that are also p
6310: 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d  art of the sort-
6320: 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a  key are omitted.
6330: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61    ** from this a
6340: 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61  rray. In this ca
6350: 73 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65  se regOrig is se
6360: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20  t to zero.  */. 
6370: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6390: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
63a0: 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20  holding current 
63b0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
63c0: 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20   regOrig;       
63d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
63e0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
63f0: 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20  ing full result 
6400: 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73  (or 0) */..  ass
6410: 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65  ert( v );.  asse
6420: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
6430: 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63   );.  hasDistinc
6440: 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20  t = pDistinct ? 
6450: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
6460: 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53  Type : WHERE_DIS
6470: 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66  TINCT_NOOP;.  if
6480: 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74  ( pSort && pSort
6490: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
64a0: 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28  pSort = 0;.  if(
64b0: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61   pSort==0 && !ha
64c0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
64d0: 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e   assert( iContin
64e0: 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  ue!=0 );.    cod
64f0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
6500: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
6510: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
6520: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
6530: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
6540: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e  nResultCol = p->
6550: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
6560: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
6570: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
6580: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
6590: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f  nPrefixReg = pSo
65a0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt->pOrderBy->nE
65b0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21  xpr;.      if( !
65c0: 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67  (pSort->sortFlag
65d0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
65e0: 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69  Sorter) ) nPrefi
65f0: 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50  xReg++;.      pP
6600: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
6610: 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a  refixReg;.    }.
6620: 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
6630: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
6640: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
6650: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6660: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
6670: 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73  Dest->iSdst+nRes
6680: 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d  ultCol > pParse-
6690: 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  >nMem ){.    /* 
66a0: 54 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  This is an error
66b0: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20   condition that 
66c0: 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20  can result, for 
66d0: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
66e0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e  SELECT.    ** on
66f0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
6700: 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52  side of an INSER
6710: 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  T contains more 
6720: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
6730: 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  han.    ** there
6740: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   are columns in 
6750: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
6760: 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f   left.  The erro
6770: 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74  r will be caught
6780: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f  .    ** and repo
6790: 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74  rted later.  But
67a0: 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
67b0: 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d   sure enough mem
67c0: 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
67d0: 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64  .    ** to avoid
67e0: 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20   other spurious 
67f0: 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65  errors in the me
6800: 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70  antime. */.    p
6810: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
6820: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20  ResultCol;.  }. 
6830: 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
6840: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65  nResultCol;.  re
6850: 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c  gOrig = regResul
6860: 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  t = pDest->iSdst
6870: 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d  ;.  if( srcTab>=
6880: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
6890: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
68a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
68b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
68c0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
68d0: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
68e0: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
68f0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
6900: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p->pEList->a[i]
6910: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
6920: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
6930: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
6940: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
6950: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
6960: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
6970: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
6980: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
6990: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
69a0: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
69b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
69c0: 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61  /.    u8 ecelFla
69d0: 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  gs;.    if( eDes
69e0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
69f0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6a00: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
6a10: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
6a20: 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c   ecelFlags = SQL
6a30: 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20  ITE_ECEL_DUP;.  
6a40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
6a50: 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  celFlags = 0;.  
6a60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72    }.    if( pSor
6a70: 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74  t && hasDistinct
6a80: 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52  ==0 && eDest!=SR
6a90: 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44  T_EphemTab && eD
6aa0: 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
6ab0: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  {.      /* For e
6ac0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
6ad0: 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61 74  n p->pEList that
6ae0: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e   is a copy of an
6af0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20   expression in. 
6b00: 20 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45       ** the ORDE
6b10: 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f  R BY clause (pSo
6b20: 72 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73  rt->pOrderBy), s
6b30: 65 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  et the associate
6b40: 64 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64  d .      ** iOrd
6b50: 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f  erByCol value to
6b60: 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74   one more than t
6b70: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
6b80: 4f 52 44 45 52 20 42 59 20 0a 20 20 20 20 20 20  ORDER BY .      
6b90: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  ** expression wi
6ba0: 74 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65  thin the sort-ke
6bb0: 79 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53  y that pushOntoS
6bc0: 6f 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e  orter() will gen
6bd0: 65 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20  erate..      ** 
6be0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
6bf0: 70 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64 20  p->pEList field 
6c00: 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72  to be omitted fr
6c10: 6f 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  om the sorted re
6c20: 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73  cord,.      ** s
6c30: 61 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64 20  aving space and 
6c40: 43 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a  CPU cycles.  */.
6c50: 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20        ecelFlags 
6c60: 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f  |= (SQLITE_ECEL_
6c70: 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f 45  OMITREF|SQLITE_E
6c80: 43 45 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20 20  CEL_REF);.      
6c90: 66 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42  for(i=pSort->nOB
6ca0: 53 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f  Sat; i<pSort->pO
6cb0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
6cc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
6cd0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   j;.        if( 
6ce0: 28 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  (j = pSort->pOrd
6cf0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
6d00: 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b  OrderByCol)>0 ){
6d10: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45  .          p->pE
6d20: 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78  List->a[j-1].u.x
6d30: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69  .iOrderByCol = i
6d40: 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  +1-pSort->nOBSat
6d50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6d60: 20 20 7d 0a 20 20 20 20 20 20 72 65 67 4f 72 69    }.      regOri
6d70: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  g = 0;.      ass
6d80: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
6d90: 53 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Set || eDest==SR
6da0: 54 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20  T_Mem .         
6db0: 20 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f    || eDest==SRT_
6dc0: 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65  Coroutine || eDe
6dd0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
6de0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73  ;.    }.    nRes
6df0: 75 6c 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ultCol = sqlite3
6e00: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
6e10: 28 70 50 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73  (pParse,p->pELis
6e20: 74 2c 72 65 67 52 65 73 75 6c 74 2c 30 2c 65 63  t,regResult,0,ec
6e30: 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  elFlags);.  }.. 
6e40: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
6e50: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
6e60: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
6e70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
6e80: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
6e90: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
6ea0: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
6eb0: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
6ec0: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
6ed0: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
6ee0: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
6ef0: 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  t ){.    switch(
6f00: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
6f10: 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  tType ){.      c
6f20: 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
6f30: 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
6f40: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
6f50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
6f60: 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   No longer requi
6f70: 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  red OpenEphemera
6f80: 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20  l instr. */.    
6f90: 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20      int iJump;  
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
6fb0: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
6fc0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
6fd0: 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
6fe0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
6ff0: 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ow content */.. 
7000: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
7010: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
7020: 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f   previous row */
7030: 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76  .        regPrev
7040: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
7050: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
7060: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
7070: 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  ltCol;..        
7080: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
7090: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
70a0: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
70b0: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
70c0: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
70d0: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
70e0: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
70f0: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
7100: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
7110: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
7120: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
7130: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
7140: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
7150: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
7160: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
7170: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
7180: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
7190: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
71a0: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
71b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
71c0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
71d0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
71e0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
71f0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
7200: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
7210: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
7220: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
7230: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
7240: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
7250: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
7260: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
7270: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
7280: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
7290: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73  ntAddr(v) + nRes
72a0: 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ultCol;.        
72b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
72c0: 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ltCol; i++){.   
72d0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
72e0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
72f0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
7300: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
7310: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
7320: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
7330: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
7340: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7350: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
7360: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
7370: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
7380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
7390: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
73a0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
73b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
73c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
73d0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
73e0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
73f0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
7400: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
7410: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
7420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7430: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7440: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
7450: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
7460: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
7470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7480: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
7490: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
74a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
74b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
74c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
74d0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
74e0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
74f0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
7500: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7510: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
7520: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
7530: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
7540: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7550: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7560: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
7570: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
7580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7590: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
75a0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
75b0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
75c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
75d0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
75e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
75f0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
7600: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
7610: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
7620: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
7630: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
7640: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
7650: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
7660: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7680: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
7690: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
76a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
76b0: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
76c0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
76d0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
76e0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
76f0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
7700: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
7710: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
7720: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
7730: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
7740: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
7750: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
7760: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
7770: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
7780: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
7790: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
77a0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
77b0: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
77c0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
77d0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
77e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
77f0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
7800: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7810: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
7820: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7830: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
7840: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7850: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
7860: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7870: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7880: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7890: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
78a0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
78b0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
78c0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
78d0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
78e0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
78f0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
7900: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
7910: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
7920: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
7930: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
7940: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
7950: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7960: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
7970: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7980: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7990: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
79a0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
79b0: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
79c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
79d0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
79e0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
79f0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
7a00: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
7a10: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
7a20: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
7a30: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
7a40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7a50: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7a60: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7a70: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7a80: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
7a90: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7aa0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7ab0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7ac0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ad0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7ae0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7af0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
7b00: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
7b10: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7b20: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
7b30: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7b40: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7b50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7b60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7b70: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7b80: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7b90: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7ba0: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7bb0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7bc0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7bd0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7be0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7bf0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
7c00: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
7c10: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
7c20: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
7c30: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
7c40: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
7c50: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7c60: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7c70: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7c80: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
7c90: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7ca0: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7cb0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7cc0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7cd0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7ce0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7cf0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7d00: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7d10: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7d20: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7d30: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
7d40: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7d50: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7d60: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7d70: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7d80: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
7d90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7da0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7dc0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7dd0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7de0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
7df0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
7e00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7e10: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
7e20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
7e30: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7e40: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7e50: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7e60: 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78  t, p, r1+nPrefix
7e70: 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31 2c  Reg,regResult,1,
7e80: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7e90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7ea0: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
7eb0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7ec0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
7ed0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ee0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7ef0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
7f00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7f20: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7f30: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7f40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7f50: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7f60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7f70: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7f80: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
7f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7fa0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
7fb0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
7fc0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
7fd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7fe0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7ff0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
8000: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
8010: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
8020: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
8030: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
8040: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
8050: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
8060: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
8070: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
8080: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
8090: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
80a0: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
80b0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
80c0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
80d0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Set: {.      if
80e0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
80f0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
8100: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
8110: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
8120: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
8130: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
8140: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
8150: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
8160: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
8170: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
8180: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
8190: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
81a0: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
81b0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
81c0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
81d0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
81e0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
81f0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
8200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
8210: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8220: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
8230: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
8240: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
8250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8260: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
8270: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8280: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  se);.        ass
8290: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c  ert( sqlite3Strl
82a0: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
82b0: 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f  Sdst)==nResultCo
82c0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
82d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
82e0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
82f0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8300: 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20  ultCol, .       
8310: 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
8320: 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c  zAffSdst, nResul
8330: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8340: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8350: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8360: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8370: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8390: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
83a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
83b0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
83c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
83d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
83e0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
83f0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
8400: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8410: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8420: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
8430: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
8440: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
8450: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
8460: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
8470: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
8480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8490: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
84a0: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
84b0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
84c0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
84d0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
84e0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
84f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
8500: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8510: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
8520: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
8530: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
8540: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
8550: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
8560: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
8570: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
8580: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
8590: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
85a0: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
85b0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
85c0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
85d0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
85e0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
85f0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
8600: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
8610: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
8620: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
8630: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
8640: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
8650: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
8660: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
8670: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
8680: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8690: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
86a0: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
86b0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
86c0: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
86d0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
86e0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
86f0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
8700: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
8710: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
8720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8730: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
8740: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8750: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
8760: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
8770: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
8780: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
8790: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
87a0: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
87b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
87c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
87d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
87e0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
87f0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
8800: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8810: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
8820: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
8830: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
8840: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
8850: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
8860: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
8870: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
88a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
88b0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
88c0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
88d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
88e0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
88f0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
8900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8920: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
8930: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
8940: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8960: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
8970: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
8980: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8990: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
89a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
89b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
89c0: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
89d0: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
89e0: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
89f0: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
8a00: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
8a10: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
8a20: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
8a30: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
8a40: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
8a50: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
8a60: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
8a70: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
8a80: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
8a90: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
8aa0: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
8ab0: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
8ac0: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
8ad0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
8ae0: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
8af0: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
8b00: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
8b10: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
8b20: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
8b30: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
8b40: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
8b50: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
8b60: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
8b70: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
8b80: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
8b90: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
8ba0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
8bb0: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
8bc0: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
8bd0: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
8be0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
8bf0: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
8c00: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
8c10: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
8c20: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
8c30: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8c40: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
8c50: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
8c60: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
8c70: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
8c80: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
8c90: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
8ca0: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
8cb0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
8cc0: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
8cd0: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
8ce0: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
8cf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
8d00: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
8d10: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
8d20: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
8d30: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
8d40: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
8d50: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
8d60: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
8d70: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
8d80: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
8d90: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
8da0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8dd0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8de0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
8df0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8e00: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8e10: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8e20: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
8e30: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8e40: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
8e50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
8e60: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
8e70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8e80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8e90: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
8ea0: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
8eb0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8ec0: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
8ed0: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
8ee0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
8ef0: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
8f00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8f10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8f20: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
8f50: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
8f60: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
8f90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8fa0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8fb0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
8fc0: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
8fd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8fe0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8ff0: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
9000: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
9010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9020: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9030: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9040: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
9050: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
9060: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
9070: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
9080: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9090: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
90a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
90b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
90c0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
90d0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
90e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
90f0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
9100: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
9110: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
9120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
9130: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
9140: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
9150: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
9160: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
9170: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
9180: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
9190: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
91a0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
91b0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
91c0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
91d0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
91e0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
91f0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
9200: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
9210: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
9220: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
9230: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
9240: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9250: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
9260: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
9270: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9280: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
9290: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
92a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
92b0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
92c0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
92d0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
92e0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
92f0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
9300: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
9310: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
9320: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
9330: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
9340: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
9350: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
9360: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9370: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
9380: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
9390: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
93a0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
93b0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
93c0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
93d0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
93e0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
93f0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
9400: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
9410: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
9420: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
9430: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
9440: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
9450: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
9460: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
9470: 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c  +1) - sizeof(Col
9480: 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66  lSeq*);.  KeyInf
9490: 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  o *p = sqlite3Db
94a0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
94b0: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
94c0: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
94d0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
94e0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
94f0: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
9500: 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20     p->nKeyField 
9510: 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d  = (u16)N;.    p-
9520: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31  >nAllField = (u1
9530: 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e  6)(N+X);.    p->
9540: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
9550: 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20     p->db = db;. 
9560: 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
9570: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d      memset(&p[1]
9580: 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20  , 0, nExtra);.  
9590: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
95a0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
95b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
95c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
95d0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
95e0: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
95f0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
9600: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
9610: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
9620: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
9630: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b  ;.    p->nRef--;
9640: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
9650: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46  ==0 ) sqlite3DbF
9660: 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b  reeNN(p->db, p);
9670: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
9680: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
9690: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
96a0: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
96b0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
96c0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
96d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
96e0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
96f0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
9700: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
9710: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
9720: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
9730: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
9740: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9750: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
9760: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
9770: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
9780: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
9790: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
97a0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
97b0: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
97c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
97d0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
97e0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
97f0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
9800: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
9810: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
9820: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
9830: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
9840: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
9850: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
9860: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
9870: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
9880: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
9890: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
98a0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
98b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
98c0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
98d0: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
98e0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
98f0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
9900: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
9910: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
9920: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
9930: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
9940: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
9950: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
9960: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
9970: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
9980: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
9990: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
99a0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
99b0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
99c0: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
99d0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
99e0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
99f0: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
9a00: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
9a10: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
9a20: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
9a30: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
9a40: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
9a50: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
9a60: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
9a70: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
9a80: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
9a90: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
9aa0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
9ab0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
9ac0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
9ad0: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
9ae0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
9af0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
9b00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9b10: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9b20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9b30: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9b40: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
9b50: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
9b60: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
9b70: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
9b80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
9b90: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
9ba0: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
9bb0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
9bc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
9bd0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
9be0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
9bf0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
9c00: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
9c10: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
9c20: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
9c30: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
9c40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9c50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
9c60: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
9c70: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
9c80: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
9c90: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
9ca0: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
9cb0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
9cc0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9cd0: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
9ce0: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
9cf0: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
9d00: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
9d10: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
9d20: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
9d30: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9d40: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  oll;.      pColl
9d50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9d60: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
9d70: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
9d80: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
9d90: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
9da0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  tColl;.      pIn
9db0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61  fo->aColl[i-iSta
9dc0: 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  rt] = pColl;.   
9dd0: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
9de0: 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d  rder[i-iStart] =
9df0: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
9e00: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
9e10: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
9e20: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
9e30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
9e40: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
9e50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
9e60: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9e70: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
9e80: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
9e90: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
9ea0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
9eb0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
9ec0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
9ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9ee0: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
9ef0: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
9f00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9f10: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
9f20: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
9f30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
9f40: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
9f50: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
9f60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
9f70: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
9f80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9f90: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
9fa0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
9fb0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
9fc0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
9fd0: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
9fe0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
9ff0: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
a000: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
a010: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
a020: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
a030: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
a040: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
a050: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
a060: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
a070: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
a080: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
a090: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
a0a0: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
a0b0: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
a0c0: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
a0d0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
a0e0: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
a0f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
a100: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
a110: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
a120: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
a130: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
a140: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
a150: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
a160: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a170: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
a180: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
a190: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
a1a0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
a1b0: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
a1c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a1d0: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
a1e0: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
a1f0: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
a200: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
a210: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
a220: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
a230: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
a240: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
a250: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
a260: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
a270: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
a280: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
a290: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
a2a0: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
a2b0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
a2c0: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
a2d0: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
a2e0: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
a2f0: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
a300: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
a310: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
a320: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
a330: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
a340: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
a350: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
a360: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
a370: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
a380: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
a390: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
a3a0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
a3b0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
a3c0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
a3d0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
a3e0: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
a3f0: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
a400: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
a410: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
a420: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a430: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
a440: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a450: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
a460: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
a470: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
a480: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
a490: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
a4a0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
a4b0: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
a4c0: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
a4d0: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
a4e0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
a4f0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
a500: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
a510: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
a520: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
a530: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
a540: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
a550: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
a560: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
a570: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
a580: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
a590: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
a5a0: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
a5b0: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
a5c0: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
a5d0: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
a5e0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
a5f0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
a600: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
a610: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
a620: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
a630: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
a640: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
a650: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
a660: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
a670: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
a680: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
a690: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
a6a0: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
a6b0: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
a6c0: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
a6d0: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
a6e0: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
a6f0: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
a700: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
a710: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
a720: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
a750: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a770: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
a780: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
a790: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
a7a0: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a7c0: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
a7d0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
a800: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
a810: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
a820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a830: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
a840: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
a850: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
a860: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
a870: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
a880: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
a890: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
a8a0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
a8b0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
a8c0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a8d0: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
a8e0: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
a8f0: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
a900: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
a910: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
a920: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
a930: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
a940: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
a950: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
a960: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
a970: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
a980: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
a990: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a9a0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
a9b0: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
a9c0: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
a9d0: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
a9e0: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
a9f0: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
aa00: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
aa10: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
aa20: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
aa30: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
aa40: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
aa50: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
aa60: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
aa70: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
aa80: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
aa90: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
aaa0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
aab0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
aac0: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
aad0: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
aae0: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
aaf0: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
ab00: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
ab10: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
ab20: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
ab30: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
ab40: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
ab50: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
ab60: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
ab70: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
ab80: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
ab90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
aba0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
abb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
abc0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
abd0: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
abe0: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
abf0: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
ac00: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
ac10: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
ac20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
ac30: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
ac40: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
ac50: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
ac60: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
ac70: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
ac80: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
ac90: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
acb0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
acc0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
acd0: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
ace0: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
acf0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
ad00: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
ad10: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
ad20: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
ad30: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
ad40: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
ad50: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
ad60: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
ad70: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
ad80: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
ad90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
ada0: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
adb0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
adc0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
add0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
ade0: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
adf0: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
ae00: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
ae10: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74   int iCol;.  int
ae20: 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f   nKey;.  int iSo
ae30: 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  rtTab;          
ae40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
ae50: 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61  er cursor to rea
ae60: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
ae70: 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20  nSortData;      
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ae90: 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74  railing values t
aea0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74  o read from sort
aeb0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  er */.  int i;. 
aec0: 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20   int bSeq;      
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74   /* True if sort
aef0: 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64  er record includ
af00: 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20  es seq. no. */. 
af10: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
af20: 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20  _item *aOutEx = 
af30: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20  p->pEList->a;.. 
af40: 20 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65   assert( addrBre
af50: 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53  ak<0 );.  if( pS
af60: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20  ort->labelBkOut 
af70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
af80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
af90: 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67  osub, pSort->reg
afa0: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c  Return, pSort->l
afb0: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20  abelBkOut);.    
afc0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
afd0: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  v, addrBreak);. 
afe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
aff0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53  solveLabel(v, pS
b000: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
b010: 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70  ;.  }.  iTab = p
b020: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  Sort->iECursor;.
b030: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b040: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
b050: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
b060: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  || eDest==SRT_Me
b070: 6d 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  m ){.    regRowi
b080: 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f  d = 0;.    regRo
b090: 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  w = pDest->iSdst
b0a0: 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20  ;.    nSortData 
b0b0: 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c  = nColumn;.  }el
b0c0: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
b0d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
b0e0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
b0f0: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
b100: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
b110: 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  Parse, nColumn);
b120: 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d  .    nSortData =
b130: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20 20   nColumn;.  }.  
b140: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
b150: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
b160: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
b170: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
b180: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
b190: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
b1a0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
b1b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
b1c0: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
b1d0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
b1e0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
b1f0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
b200: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
b210: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
b220: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
b230: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
b240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b250: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
b260: 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c  seudo, iSortTab,
b270: 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65   regSortOut, nKe
b280: 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a  y+1+nSortData);.
b290: 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65      if( addrOnce
b2a0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
b2b0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e  mpHere(v, addrOn
b2c0: 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  ce);.    addr = 
b2d0: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
b2e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
b2f0: 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  erSort, iTab, ad
b300: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64  drBreak);.    Vd
b310: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b320: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
b330: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
b340: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
b350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b360: 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
b370: 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72  ta, iTab, regSor
b380: 74 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b  tOut, iSortTab);
b390: 0a 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20  .    bSeq = 0;. 
b3a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
b3b0: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
b3c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b3d0: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
b3e0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
b3f0: 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65  age(v);.    code
b400: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
b410: 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e  fset, addrContin
b420: 75 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61  ue);.    iSortTa
b430: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53  b = iTab;.    bS
b440: 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f  eq = 1;.  }.  fo
b450: 72 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79  r(i=0, iCol=nKey
b460: 2b 62 53 65 71 3b 20 69 3c 6e 53 6f 72 74 44 61  +bSeq; i<nSortDa
b470: 74 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ta; i++){.    in
b480: 74 20 69 52 65 61 64 3b 0a 20 20 20 20 69 66 28  t iRead;.    if(
b490: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
b4a0: 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20  OrderByCol ){.  
b4b0: 20 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74      iRead = aOut
b4c0: 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  Ex[i].u.x.iOrder
b4d0: 42 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c  ByCol-1;.    }el
b4e0: 73 65 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20  se{.      iRead 
b4f0: 3d 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a  = iCol++;.    }.
b500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b510: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
b520: 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 52  mn, iSortTab, iR
b530: 65 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a  ead, regRow+i);.
b540: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
b550: 28 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78  (v, "%s", aOutEx
b560: 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74  [i].zName ? aOut
b570: 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f  Ex[i].zName : aO
b580: 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b  utEx[i].zSpan));
b590: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
b5a0: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
b5b0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
b5c0: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
b5d0: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
b5e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b5f0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
b600: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
b610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b620: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
b630: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
b640: 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ow, regRowid);. 
b650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b660: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
b670: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
b680: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b6a0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
b6b0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
b6c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
b6d0: 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74  olumn==sqlite3St
b6e0: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
b6f0: 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20  ffSdst) );.     
b700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b710: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
b720: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  ord, regRow, nCo
b730: 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a  lumn, regRowid,.
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a          pDest->z
b760: 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  AffSdst, nColumn
b770: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b780: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
b790: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
b7a0: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
b7b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b7c0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
b7d0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
b7e0: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72  arm, regRowid, r
b7f0: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
b800: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b810: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
b820: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _Mem: {.      /*
b830: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
b840: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
b850: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
b860: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
b870: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
b880: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
b890: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
b8a0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
b8b0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
b8c0: 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74  tine ); .      t
b8d0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
b8e0: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
b8f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
b900: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
b910: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
b920: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
b930: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
b940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b950: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
b960: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
b970: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
b980: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
b990: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
b9a0: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53  Parse, pDest->iS
b9b0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
b9c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b9d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b9e0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
b9f0: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
ba00: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
ba10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ba20: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69   }.  if( regRowi
ba30: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65  d ){.    if( eDe
ba40: 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20  st==SRT_Set ){. 
ba50: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
ba60: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
ba70: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
ba80: 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lumn);.    }else
ba90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
baa0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
bab0: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
bac0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
bad0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
bae0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
baf0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62  ;.  }.  /* The b
bb00: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
bb10: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
bb20: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
bb30: 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  (v, addrContinue
bb40: 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  );.  if( pSort->
bb50: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
bb60: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
bb70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
bb80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
bb90: 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20  rterNext, iTab, 
bba0: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
bbb0: 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  age(v);.  }else{
bbc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bbd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
bbe0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
bbf0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
bc00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
bc10: 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71  ->regReturn ) sq
bc20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bc30: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53  v, OP_Return, pS
bc40: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  ort->regReturn);
bc50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
bc60: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
bc70: 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  drBreak);.}../*.
bc80: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
bc90: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
bca0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
bcb0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
bcc0: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
bcd0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
bce0: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
bcf0: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
bd00: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
bd10: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20  .**.** Also try 
bd20: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
bd30: 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75  size of the retu
bd40: 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72  rned value and r
bd50: 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65  eturn that.** re
bd60: 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64  sult in *pEstWid
bd70: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  th..**.** The de
bd80: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
bd90: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
bda0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
bdb0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
bdc0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
bdd0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
bde0: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
bdf0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
be00: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
be10: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
be20: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
be30: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
be40: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
be50: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
be60: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
be70: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
be80: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
be90: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
bea0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
beb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
bec0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
bed0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
bee0: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
bef0: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
bf00: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
bf10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
bf20: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
bf30: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
bf40: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
bf50: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
bf60: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
bf70: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
bf80: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
bf90: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
bfa0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
bfb0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
bfc0: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
bfd0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
bfe0: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
bff0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
c000: 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72  utine has either
c010: 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65   3 or 6 paramete
c020: 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  rs depending on 
c030: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
c040: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  * the SQLITE_ENA
c050: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
c060: 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ATA compile-time
c070: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e   option is used.
c080: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
c090: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c0a0: 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e  METADATA.# defin
c0b0: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
c0c0: 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e  ,C,D,E,F) column
c0d0: 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44  TypeImpl(A,B,C,D
c0e0: 2c 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69  ,E,F).#else /* i
c0f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
c100: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c110: 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64  METADATA) */.# d
c120: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
c130: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
c140: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
c150: 2c 46 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ,F).#endif.stati
c160: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
c170: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20  lumnTypeImpl(.  
c180: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
c190: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
c1a0: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
c1b0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c1c0: 54 41 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63  TADATA.  const c
c1d0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a  har **pzOrigDb,.
c1e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
c1f0: 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73  zOrigTab,.  cons
c200: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43  t char **pzOrigC
c210: 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20  ol,.#endif.  u8 
c220: 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20  *pEstWidth.){.  
c230: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
c240: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  e = 0;.  int j;.
c250: 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20    u8 estWidth = 
c260: 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
c270: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c280: 45 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63  ETADATA.  char c
c290: 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20  onst *zOrigDb = 
c2a0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
c2b0: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
c2c0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
c2d0: 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  igCol = 0;.#endi
c2e0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  f..  assert( pEx
c2f0: 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pr!=0 );.  asser
c300: 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
c310: 21 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  !=0 );.  switch(
c320: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
c330: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
c340: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
c350: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
c360: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
c370: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
c380: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
c390: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
c3a0: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
c3b0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
c3c0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
c3d0: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
c3e0: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
c3f0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
c400: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
c410: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
c420: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c430: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c440: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
c450: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
c460: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
c470: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
c480: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c490: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
c4a0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
c4b0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
c4c0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
c4d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
c4e0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
c4f0: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
c500: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
c510: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
c520: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
c530: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
c540: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
c550: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
c560: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
c570: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
c580: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
c590: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
c5a0: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
c5b0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
c5c0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
c5d0: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
c5e0: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
c5f0: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
c600: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
c610: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
c620: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
c630: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
c640: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
c650: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
c660: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
c670: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
c680: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c690: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
c6a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
c6b0: 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63  * At one time, c
c6c0: 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c  ode such as "SEL
c6d0: 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69  ECT new.x" withi
c6e0: 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c  n a trigger woul
c6f0: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75  d.        ** cau
c700: 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  se this conditio
c710: 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65  n to run.  Since
c720: 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72   then, we have r
c730: 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a  estructured how.
c740: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67          ** trigg
c750: 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  er code is gener
c760: 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73  ated and so this
c770: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
c780: 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20   longer .       
c790: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f   ** possible. Ho
c7a0: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74  wever, it can st
c7b0: 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20  ill be true for 
c7c0: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
c7d0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
c7e0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20  ollowing:.      
c7f0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
c800: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
c810: 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a  1(col INTEGER);.
c820: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
c830: 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63  ECT (SELECT t1.c
c840: 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31  ol) FROM FROM t1
c850: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ;.        **.   
c860: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c       ** when col
c870: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
c880: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
c890: 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69  ssion "t1.col" i
c8a0: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  n the .        *
c8b0: 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e  * sub-select. In
c8c0: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
c8d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
c8e0: 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20  to NULL, even.  
c8f0: 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20        ** though 
c900: 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79  it should really
c910: 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20   be "INTEGER".. 
c920: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
c930: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
c940: 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74   a problem, as t
c950: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f  he column type o
c960: 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65  f "t1.col" is ne
c970: 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  ver.        ** u
c980: 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e  sed. When column
c990: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
c9a0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
c9b0: 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  on .        ** "
c9c0: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22  (SELECT t1.col)"
c9d0: 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  , the correct ty
c9e0: 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28  pe is returned (
c9f0: 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43  see the TK_SELEC
ca00: 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61  T.        ** bra
ca10: 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  nch below.  */. 
ca20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ca30: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
ca40: 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78  ert( pTab && pEx
ca50: 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29  pr->pTab==pTab )
ca60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
ca70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
ca80: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
ca90: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
caa0: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
cab0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
cac0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
cad0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cae0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
caf0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
cb00: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
cb10: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
cb20: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
cb30: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
cb40: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
cb50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
cb60: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53  ol>=0 && iCol<pS
cb70: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
cb80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
cb90: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
cba0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
cbb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
cbc0: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
cbd0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
cbe0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
cbf0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
cc00: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
cc10: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
cc20: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
cc30: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
cc40: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
cc50: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
cc60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
cc70: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
cc80: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
cc90: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
cca0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
ccb0: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
ccc0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
ccd0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
cce0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
ccf0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
cd00: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
cd10: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
cd20: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
cd30: 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62  &sNC, p,&zOrigDb
cd40: 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69  ,&zOrigTab,&zOri
cd50: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
cd60: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
cd70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
cd80: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
cd90: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
cda0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
cdb0: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
cdc0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
cdd0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
cde0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
cdf0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
ce00: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
ce10: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
ce20: 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) );.#ifdef SQLI
ce30: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
ce40: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20  _METADATA.      
ce50: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
ce60: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
ce70: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
ce80: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
ce90: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
cea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ceb0: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
cec0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ced0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
cee0: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
cef0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
cf00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
cf10: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
cf20: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
cf30: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
cf40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cf50: 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d  zOrigTab = pTab-
cf60: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
cf70: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
cf80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
cf90: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
cfa0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
cfb0: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
cfc0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
cfd0: 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d         zOrigDb =
cfe0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pNC->pParse->db
cff0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
d000: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
d010: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
d020: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
d030: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
d040: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
d050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d060: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
d070: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
d080: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
d090: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
d0a0: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
d0b0: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
d0c0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
d0d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
d0e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
d0f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
d100: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
d110: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
d120: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
d130: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
d140: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
d150: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
d160: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
d170: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
d180: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
d190: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
d1a0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
d1b0: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
d1c0: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
d1d0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
d1e0: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
d1f0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78  t *pS = pExpr->x
d200: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
d210: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
d220: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
d230: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d240: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
d250: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
d260: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
d270: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
d280: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
d290: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
d2a0: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
d2b0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
d2c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d2d0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d2e0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
d2f0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
d300: 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20  &estWidth); .   
d310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d320: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
d330: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d340: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
d350: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
d360: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
d370: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
d380: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
d390: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
d3a0: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
d3b0: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
d3c0: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
d3d0: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
d3e0: 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57  ndif.  if( pEstW
d3f0: 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74  idth ) *pEstWidt
d400: 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20  h = estWidth;.  
d410: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
d420: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d430: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
d440: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
d450: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
d460: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
d470: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
d480: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
d490: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
d4a0: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
d4b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
d4c0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
d4d0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
d4e0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
d4f0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
d500: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
d510: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
d520: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
d530: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
d540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d550: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
d560: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
d570: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
d580: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
d590: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
d5a0: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
d5b0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
d5c0: 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65  Parse;.  sNC.pNe
d5d0: 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  xt = 0;.  for(i=
d5e0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
d5f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
d600: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
d610: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
d620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
d630: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
d640: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
d650: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
d660: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
d670: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
d680: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
d690: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
d6a0: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
d6b0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
d6c0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
d6d0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
d6e0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
d6f0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65   0);..    /* The
d700: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
d710: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
d720: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
d730: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
d740: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
d750: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
d760: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
d770: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
d780: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
d790: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
d7a0: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
d7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d7c0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d7d0: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
d7e0: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
d7f0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
d800: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d810: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d820: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
d830: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
d840: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
d850: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d860: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
d870: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
d880: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d890: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
d8a0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
d8b0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
d8c0: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
d8d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d8e0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d8f0: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
d900: 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52  zType, SQLITE_TR
d910: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
d920: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
d930: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43  (SQLITE_OMIT_DEC
d940: 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  LTYPE) */.}.../*
d950: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
d960: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
d970: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
d980: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ent..**.** The o
d990: 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68  nly guarantee th
d9a0: 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20  at SQLite makes 
d9b0: 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  about column nam
d9c0: 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68  es is that if th
d9d0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20  e.** column has 
d9e0: 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73  an AS clause ass
d9f0: 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65  igning it a name
da00: 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74  , that will be t
da10: 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a  he name used..**
da20: 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c   That is the onl
da30: 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61  y documented gua
da40: 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72  rantee.  However
da50: 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c  , countless appl
da60: 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65  ications.** deve
da70: 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79  loped over the y
da80: 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62  ears have made b
da90: 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69  aseless assumpti
daa0: 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e  ons about column
dab0: 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69   names.** and wi
dac0: 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73  ll break if thos
dad0: 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68  e assumptions ch
dae0: 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75  anges.  Hence, u
daf0: 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69  se extreme cauti
db00: 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66  on.** when modif
db10: 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ying this routin
db20: 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b  e to avoid break
db30: 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a  ing legacy..**.*
db40: 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69  * See Also: sqli
db50: 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
db60: 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54  prList().**.** T
db70: 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f  he PRAGMA short_
db80: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64  column_names and
db90: 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c   PRAGMA full_col
dba0: 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e  umn_names settin
dbb0: 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63  gs are.** deprec
dbc0: 61 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75  ated.  The defau
dbd0: 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68  lt setting is sh
dbe0: 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46  ort=ON, full=OFF
dbf0: 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a  .  99.9% of all.
dc00: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  ** applications 
dc10: 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74  should operate t
dc20: 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74  his way.  Nevert
dc30: 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20  heless, we need 
dc40: 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a  to support the.*
dc50: 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f  * other modes fo
dc60: 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20  r legacy:.**.** 
dc70: 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75     short=OFF, fu
dc80: 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c  ll=OFF:      Col
dc90: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20  umn name is the 
dca0: 74 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72  text of the expr
dcb0: 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a  ession has it.**
dcc0: 20 20 20 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 6f 72                or
dce0: 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73  iginally appears
dcf0: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
dd00: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a  tatement.  In.**
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74                ot
dd30: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a  her words, the z
dd40: 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75  Span of the resu
dd50: 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  lt expression..*
dd60: 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e  *.**    short=ON
dd70: 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20  , full=OFF:     
dd80: 20 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64    (This is the d
dd90: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e  efault setting).
dda0: 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a    If the result.
ddb0: 2a 2a 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 20                  
ddd0: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
dde0: 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  to a table colum
ddf0: 6e 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  n, then the resu
de00: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69     column name i
de30: 73 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65  s just the table
de40: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 43 4f   column name: CO
de50: 4c 55 4d 4e 2e 20 0a 2a 2a 20 20 20 20 20 20 20  LUMN. .**       
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 4f 74 68 65 72 77 69 73 65         Otherwise
de80: 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a   use zSpan..**.*
de90: 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68  *    full=ON, sh
dea0: 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49  ort=ANY:       I
deb0: 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66  f the result ref
dec0: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
ded0: 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a  a table column,.
dee0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
df10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68  column name with
df20: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a   the table name.
df30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c  prefix, ex: TABL
df60: 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72  E.COLUMN.  Other
df70: 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a  wise use zSpan..
df80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
df90: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
dfa0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
dfb0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
dfc0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
dfd0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
dfe0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
dff0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
e000: 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74  r this SELECT st
e010: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
e020: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
e030: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
e040: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
e050: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
e060: 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
e070: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69   *pEList;.  sqli
e080: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e090: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
e0a0: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c  Name;    /* TABL
e0b0: 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41  E.COLUMN if no A
e0c0: 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20  S clause and is 
e0d0: 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72  a direct table r
e0e0: 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e  ef */.  int srcN
e0f0: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55  ame;     /* COLU
e100: 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55  MN or TABLE.COLU
e110: 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75  MN if no AS clau
e120: 73 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74  se and is direct
e130: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
e140: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
e150: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
e160: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
e170: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
e180: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
e190: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
e1a0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
e1b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
e1c0: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d  lNamesSet || db-
e1d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
e1e0: 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c  return;.  /* Col
e1f0: 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64 65  umn names are de
e200: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
e210: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
e220: 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
e230: 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ect */.  while( 
e240: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
e250: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
e260: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 70  ect->pPrior;.  p
e270: 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  TabList = pSelec
e280: 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  t->pSrc;.  pELis
e290: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
e2a0: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 76  ist;.  assert( v
e2b0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e2c0: 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a   pTabList!=0 );.
e2d0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
e2e0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
e2f0: 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61  lName = (db->fla
e300: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
e310: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
e320: 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66  srcName = (db->f
e330: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
e340: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20  ortColNames)!=0 
e350: 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73  || fullName;.  s
e360: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
e370: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
e380: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
e390: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
e3a0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
e3b0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
e3c0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20  a[i].pExpr;..   
e3d0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
e3e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
e3f0: 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
e400: 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72 6f  N );  /* Agg pro
e410: 63 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74 20  cessing has not 
e420: 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20 61  run yet */.    a
e430: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
e440: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54  _COLUMN || p->pT
e450: 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76 65  ab!=0 ); /* Cove
e460: 72 69 6e 67 20 69 6e 64 65 78 65 73 20 6e 6f 74  ring indexes not
e470: 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20   yet coded */.  
e480: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
e490: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
e4a0: 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73    /* An AS claus
e4b0: 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66  e always takes f
e4c0: 69 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f  irst priority */
e4d0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
e4e0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
e4f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
e500: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
e510: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
e520: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
e530: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
e540: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
e550: 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f   srcName && p->o
e560: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
e570: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
e580: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
e590: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
e5a0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70       pTab = p->p
e5b0: 54 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Tab;.      asser
e5c0: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
e5d0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e5e0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
e5f0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
e600: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
e610: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
e620: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
e630: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
e640: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
e650: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
e660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e670: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
e680: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
e690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e6a0: 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   fullName ){.   
e6b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
e6c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
e6d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
e6e0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
e6f0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
e700: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
e710: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
e720: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
e730: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
e740: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
e750: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e770: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
e780: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
e790: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
e7a0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
e7b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e7c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
e7d0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
e7e0: 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a  pan;.      z = z
e7f0: 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72  ==0 ? sqlite3MPr
e800: 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
e810: 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69  %d", i+1) : sqli
e820: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e830: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
e840: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
e850: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
e860: 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59  ME, z, SQLITE_DY
e870: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
e880: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
e890: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
e8a0: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
e8b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
e8c0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
e8d0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
e8e0: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
e8f0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
e900: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
e910: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
e920: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
e930: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
e940: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
e950: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
e960: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
e970: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e980: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
e990: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
e9a0: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
e9b0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
e9c0: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
e9d0: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
e9e0: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
e9f0: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
ea00: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
ea10: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
ea20: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
ea30: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
ea40: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
ea50: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
ea60: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
ea70: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
ea80: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
ea90: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
eaa0: 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68  _NOMEM..**.** Th
eab0: 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65  e only guarantee
eac0: 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b   that SQLite mak
ead0: 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  es about column 
eae0: 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66  names is that if
eaf0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68   the.** column h
eb00: 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  as an AS clause 
eb10: 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e  assigning it a n
eb20: 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62  ame, that will b
eb30: 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e  e the name used.
eb40: 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20  .** That is the 
eb50: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20  only documented 
eb60: 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65  guarantee.  Howe
eb70: 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61  ver, countless a
eb80: 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64  pplications.** d
eb90: 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68  eveloped over th
eba0: 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64  e years have mad
ebb0: 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d  e baseless assum
ebc0: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c  ptions about col
ebd0: 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64  umn names.** and
ebe0: 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74   will break if t
ebf0: 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73  hose assumptions
ec00: 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65   changes.  Hence
ec10: 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61  , use extreme ca
ec20: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f  ution.** when mo
ec30: 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75  difying this rou
ec40: 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72  tine to avoid br
ec50: 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a  eaking legacy..*
ec60: 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67  *.** See Also: g
ec70: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ec80: 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es().*/.int sqli
ec90: 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
eca0: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
ecb0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
ecc0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ecd0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
ece0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
ecf0: 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
ed00: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
ed10: 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
ed20: 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
ed30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
ed40: 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
ed50: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
ed60: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
ed70: 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
ed80: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
ed90: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
eda0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
edb0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
edc0: 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
edd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
ede0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee00: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
ee10: 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20  .  u32 cnt;     
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee30: 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
ee40: 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
ee50: 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
ee60: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
ee70: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
ee80: 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
ee90: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
eea0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
eeb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
eec0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
eed0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
eee0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  t */.  char *zNa
eef0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
ef00: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
ef10: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
ef20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ef30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61     /* Size of na
ef40: 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f  me in zName[] */
ef50: 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20  .  Hash ht;     
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ef70: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20  * Hash table of 
ef80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
ef90: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
efa0: 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70  it(&ht);.  if( p
efb0: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
efc0: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
efd0: 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
efe0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
eff0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
f000: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
f010: 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
f020: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
f030: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
f040: 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
f050: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28   assert( nCol==(
f060: 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70  i16)nCol );.  *p
f070: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
f080: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
f090: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
f0a0: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21  Col; i<nCol && !
f0b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f0c0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
f0d0: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
f0e0: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
f0f0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
f100: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e    */.    if( (zN
f110: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
f120: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
f130: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f140: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
f150: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
f160: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
f170: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
f180: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f190: 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72    Expr *pColExpr
f1a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
f1b0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74  ipCollate(pEList
f1c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
f1d0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c       while( pCol
f1e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  Expr->op==TK_DOT
f1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
f200: 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Expr = pColExpr-
f210: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
f220: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
f230: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  r!=0 );.      }.
f240: 20 20 20 20 20 20 69 66 28 20 28 70 43 6f 6c 45        if( (pColE
f250: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
f260: 4d 4e 20 7c 7c 20 70 43 6f 6c 45 78 70 72 2d 3e  MN || pColExpr->
f270: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
f280: 4e 29 0a 20 20 20 20 20 20 20 26 26 20 70 43 6f  N).       && pCo
f290: 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 0a  lExpr->pTab!=0 .
f2a0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
f2b0: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
f2c0: 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  use the column n
f2d0: 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
f2e0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
f2f0: 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ColExpr->iColumn
f300: 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  ;.        Table 
f310: 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72  *pTab = pColExpr
f320: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
f330: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
f340: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
f350: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
f360: 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d   iCol>=0 ? pTab-
f370: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
f380: 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  e : "rowid";.   
f390: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f     }else if( pCo
f3a0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  lExpr->op==TK_ID
f3b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
f3c0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
f3d0: 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45  erty(pColExpr, E
f3e0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
f3f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
f400: 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ColExpr->u.zToke
f410: 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
f420: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
f430: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
f440: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
f450: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
f460: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
f470: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
f480: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
f490: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
f4a0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
f4b0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
f4c0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
f4d0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
f4e0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
f4f0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
f500: 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29  ,"column%d",i+1)
f510: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f520: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
f530: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
f540: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
f550: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
f560: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
f570: 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  n integer to the
f580: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
f590: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
f5a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20  .    */.    cnt 
f5b0: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
f5c0: 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  zName && sqlite3
f5d0: 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e  HashFind(&ht, zN
f5e0: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
f5f0: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
f600: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
f610: 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65  .      if( nName
f620: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  >0 ){.        fo
f630: 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30  r(j=nName-1; j>0
f640: 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67   && sqlite3Isdig
f650: 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d  it(zName[j]); j-
f660: 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -){}.        if(
f670: 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29   zName[j]==':' )
f680: 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20   nName = j;.    
f690: 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20    }.      zName 
f6a0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
f6b0: 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20  (db, "%.*z:%u", 
f6c0: 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b  nName, zName, ++
f6d0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  cnt);.      if( 
f6e0: 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f  cnt>3 ) sqlite3_
f6f0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
f700: 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20  f(cnt), &cnt);. 
f710: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
f720: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
f730: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50    sqlite3ColumnP
f740: 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d  ropertiesFromNam
f750: 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20  e(0, pCol);.    
f760: 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c  if( zName && sql
f770: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
f780: 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29  ht, zName, pCol)
f790: 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ==pCol ){.      
f7a0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
f7b0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  db);.    }.  }. 
f7c0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
f7d0: 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62  r(&ht);.  if( db
f7e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f7f0: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
f800: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
f810: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f820: 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  , aCol[j].zName)
f830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
f840: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
f850: 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20  ol);.    *paCol 
f860: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20  = 0;.    *pnCol 
f870: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
f880: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
f890: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
f8a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f8b0: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
f8c0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
f8d0: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
f8e0: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
f8f0: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
f900: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
f910: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
f920: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
f930: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
f940: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
f950: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
f960: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
f970: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
f980: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
f990: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
f9a0: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
f9b0: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
f9c0: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
f9d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f9e0: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
f9f0: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
fa00: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
fa10: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
fa20: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f   resolved..*/.vo
fa30: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
fa40: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
fa50: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
fa60: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
fa70: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
fa80: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c  ntexts */.  Tabl
fa90: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
faa0: 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20    /* Add column 
fab0: 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  type information
fac0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
fad0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
fae0: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
faf0: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
fb00: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
fb10: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
fb20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
fb30: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
fb40: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
fb50: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
fb60: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
fb70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
fb80: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
fb90: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
fba0: 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30  .  u64 szAll = 0
fbb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
fbc0: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
fbd0: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
fbe0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
fbf0: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
fc00: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
fc10: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
fc20: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
fc30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
fc40: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
fc50: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
fc60: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
fc70: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
fc80: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
fc90: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
fca0: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
fcb0: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
fcc0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
fcd0: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  ->aCol; i<pTab->
fce0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
fcf0: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
fd00: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69  ar *zType;.    i
fd10: 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d  nt n, m;.    p =
fd20: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
fd30: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
fd40: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
fd50: 30 2c 20 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45  0, 0, &pCol->szE
fd60: 73 74 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20 2b  st);.    szAll +
fd70: 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20  = pCol->szEst;. 
fd80: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
fd90: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
fda0: 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20  ffinity(p);.    
fdb0: 69 66 28 20 7a 54 79 70 65 20 26 26 20 28 6d 20  if( zType && (m 
fdc0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
fdd0: 30 28 7a 54 79 70 65 29 29 3e 30 20 29 7b 0a 20  0(zType))>0 ){. 
fde0: 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
fdf0: 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a  Strlen30(pCol->z
fe00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f  Name);.      pCo
fe10: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  l->zName = sqlit
fe20: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
fe30: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  e(db, pCol->zNam
fe40: 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20  e, n+m+2);.     
fe50: 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   if( pCol->zName
fe60: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
fe70: 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b  py(&pCol->zName[
fe80: 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31  n+1], zType, m+1
fe90: 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  );.        pCol-
fea0: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
feb0: 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20  FLAG_HASTYPE;.  
fec0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fed0: 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  if( pCol->affini
fee0: 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66  ty==0 ) pCol->af
fef0: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
ff00: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43  AFF_BLOB;.    pC
ff10: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
ff20: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
ff30: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   p);.    if( pCo
ff40: 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  ll && pCol->zCol
ff50: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43  l==0 ){.      pC
ff60: 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->zColl = sqli
ff70: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ff80: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
ff90: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d     }.  }.  pTab-
ffa0: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
ffb0: 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a  te3LogEst(szAll*
ffc0: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  4);.}../*.** Giv
ffd0: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
ffe0: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
fff0: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
10000 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
10010 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
10020 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
10030 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
10040 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
10050 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
10060 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
10070 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
10080 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
10090 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
100a0 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
100b0 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
100c0 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
100d0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
100e0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
100f0 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
10100 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
10110 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
10120 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
10130 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
10140 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
10150 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
10160 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
10170 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
10180 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
10190 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
101a0 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
101b0 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
101c0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
101d0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
101e0 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
101f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10200 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
10210 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
10220 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c  fSelect() is onl
10230 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74  y used n context
10240 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64  s where lookasid
10250 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  e.  ** is disabl
10260 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
10270 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
10280 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61 62  isable );.  pTab
10290 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
102a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
102b0 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ;.  pTab->nRowLo
102c0 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
102d0 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
102e0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
102f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  );.  sqlite3Colu
10300 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
10310 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
10320 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
10330 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
10340 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  l);.  sqlite3Sel
10350 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
10360 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
10370 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65  rse, pTab, pSele
10380 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
10390 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
103a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
103b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
103c0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
103d0 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
103e0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
103f0 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
10400 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
10410 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
10420 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
10430 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
10440 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
10450 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
10460 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
10470 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
10480 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
10490 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
104a0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
104b0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
104c0 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65 74  pVdbe ){.    ret
104d0 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64 62  urn pParse->pVdb
104e0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
104f0 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d  rse->pToplevel==
10500 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
10510 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
10520 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61  se->db,SQLITE_Fa
10530 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20  ctorOutConst).  
10540 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f  ){.    pParse->o
10550 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31  kConstFactor = 1
10560 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
10570 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
10580 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a  (pParse);.}.../*
10590 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
105a0 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
105b0 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
105c0 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
105d0 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
105e0 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
105f0 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20  ssions.  pLimit 
10600 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64  and pOffset hold
10610 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
10620 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
10630 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
10640 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
10650 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
10660 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
10670 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
10680 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
10690 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
106a0 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
106b0 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
106c0 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
106d0 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
106e0 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
106f0 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
10700 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
10710 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
10720 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
10730 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
10740 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
10750 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
10760 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
10770 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
10780 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d  e values of iLim
10790 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
107a0 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
107b0 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
107c0 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74  efined by pLimit
107d0 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69   and pOffset.  i
107e0 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
107f0 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
10800 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
10810 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
10820 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f  ult values (zero
10830 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
10840 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
10850 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f  ne..**.** The iO
10860 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28  ffset register (
10870 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
10880 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
10890 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
108a0 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65  the OFFSET.  The
108b0 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72   iLimit register
108c0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
108d0 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73  to LIMIT.  Regis
108e0 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31  ter.** iOffset+1
108f0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
10900 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e  to LIMIT+OFFSET.
10910 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  .**.** Only if p
10920 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66  Limit!=0 or pOff
10930 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  set!=0 do the li
10940 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
10950 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
10960 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
10970 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
10980 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
10990 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
109a0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
109b0 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
109c0 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
109d0 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
109e0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
109f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
10a00 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
10a10 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
10a20 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
10a30 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
10a40 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
10a50 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
10a60 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
10a70 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  n;.  if( p->iLim
10a80 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
10a90 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
10aa0 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
10ab0 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
10ac0 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
10ad0 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74  ontroversy about
10ae0 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
10af0 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
10b00 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
10b10 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
10b20 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
10b30 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
10b40 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
10b50 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
10b60 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
10b70 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
10b80 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c   p->pOffset==0 |
10b90 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  | p->pLimit!=0 )
10ba0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  ;.  if( p->pLimi
10bb0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
10bc0 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
10bd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10be0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
10bf0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10c00 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
10c10 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
10c20 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
10c30 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b  ->pLimit, &n) ){
10c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10c50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10c60 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
10c70 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
10c80 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
10c90 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
10ca0 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
10cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10cc0 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b  beGoto(v, iBreak
10cd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
10ce0 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53  f( n>=0 && p->nS
10cf0 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33  electRow>sqlite3
10d00 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29  LogEst((u64)n) )
10d10 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
10d20 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
10d30 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b  3LogEst((u64)n);
10d40 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
10d50 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64  lags |= SF_Fixed
10d60 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
10d70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
10d90 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
10da0 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
10db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10dc0 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
10dd0 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64  Int, iLimit); Vd
10de0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
10df0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10e00 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
10e10 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
10e20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10e30 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
10e40 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
10e50 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
10e60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
10e70 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
10e80 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
10e90 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
10ea0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
10eb0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20  arse->nMem++;   
10ec0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65  /* Allocate an e
10ed0 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f  xtra register fo
10ee0 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a  r limit+offset *
10ef0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
10f00 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10f10 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66  p->pOffset, iOff
10f20 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
10f30 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10f40 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
10f50 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76  Offset); VdbeCov
10f60 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10f70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10f80 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
10f90 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
10fa0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10fb0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69  P_OffsetLimit, i
10fc0 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31  Limit, iOffset+1
10fd0 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
10fe0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10ff0 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
11000 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
11010 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11020 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
11030 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
11040 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
11050 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
11060 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
11070 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
11080 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
11090 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
110a0 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
110b0 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
110c0 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
110d0 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
110e0 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
110f0 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
11100 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
11110 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
11120 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
11130 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
11140 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
11150 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
11160 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
11170 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
11180 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
11190 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
111a0 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
111b0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
111c0 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
111d0 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
111e0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
111f0 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
11200 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
11210 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
11220 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
11230 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
11240 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
11250 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20  =0 );.  /* iCol 
11260 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61  must be less tha
11270 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  n p->pEList->nEx
11280 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  pr.  Otherwise a
11290 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20  n error would.  
112a0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72  ** have been thr
112b0 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20  own during name 
112c0 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77  resolution and w
112d0 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65  e would not have
112e0 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69   gotten.  ** thi
112f0 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70  s far */.  if( p
11300 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  Ret==0 && ALWAYS
11310 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d  (iCol<p->pEList-
11320 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70  >nExpr) ){.    p
11330 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
11340 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
11350 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
11360 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
11370 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
11380 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
11390 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
113a0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
113b0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  d parameter is a
113c0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
113d0 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45  .** with an ORDE
113e0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69  R BY clause. Thi
113f0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
11400 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
11410 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74   a KeyInfo.** st
11420 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65  ructure suitable
11430 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   for implementin
11440 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  g the ORDER BY..
11450 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
11460 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
11470 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
11480 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
11490 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  c. The calling.*
114a0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
114b0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
114c0 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73  suring that this
114d0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
114e0 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
114f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
11500 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63  Info *multiSelec
11510 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
11520 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
11530 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45  elect *p, int nE
11540 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73  xtra){.  ExprLis
11550 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
11560 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
11570 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   nOrderBy = p->p
11580 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
11590 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
115a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
115b0 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71  yInfo *pRet = sq
115c0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
115d0 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e  c(db, nOrderBy+n
115e0 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28  Extra, 1);.  if(
115f0 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   pRet ){.    int
11600 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
11610 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
11620 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
11630 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
11640 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79  Item = &pOrderBy
11650 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78  ->a[i];.      Ex
11660 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65  pr *pTerm = pIte
11670 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
11680 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
11690 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
116a0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
116b0 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
116c0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
116d0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
116e0 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
116f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11700 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
11710 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
11720 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  e, p, pItem->u.x
11730 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b  .iOrderByCol-1);
11740 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
11750 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
11760 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
11770 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
11780 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20  >a[i].pExpr =.  
11790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
117a0 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
117b0 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
117c0 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
117d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
117e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
117f0 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
11800 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20  e(pRet) );.     
11810 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pRet->aColl[i] 
11820 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
11830 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Ret->aSortOrder[
11840 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
11850 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
11860 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
11870 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
11880 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11890 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CTE./*.** This r
118a0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
118b0 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f   VDBE code to co
118c0 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpute the conten
118d0 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55  t of a WITH RECU
118e0 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f  RSIVE.** query o
118f0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
11900 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74  *   <recursive-t
11910 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70  able> AS (<setup
11920 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41  -query> UNION [A
11930 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71  LL] <recursive-q
11940 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20  uery>).**       
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20    \___________/ 
11970 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
11980 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
119b0 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
119c0 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a            p.**.*
119d0 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78  *.** There is ex
119e0 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65  actly one refere
119f0 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72  nce to the recur
11a00 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68  sive-table in th
11a10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  e FROM clause.**
11a20 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75   of recursive-qu
11a30 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68  ery, marked with
11a40 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b   the SrcList->a[
11a50 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
11a60 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   flag..**.** The
11a70 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e   setup-query run
11a80 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61  s once to genera
11a90 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65  te an initial se
11aa0 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67  t of rows that g
11ab0 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75  o.** into a Queu
11ac0 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61  e table.  Rows a
11ad0 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
11ae0 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  m the Queue tabl
11af0 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e  e one by.** one.
11b00 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61    Each row extra
11b10 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20  cted from Queue 
11b20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  is output to pDe
11b30 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69  st.  Then the si
11b40 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65  ngle.** extracte
11b50 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68  d row (now in th
11b60 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65  e iCurrent table
11b70 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  ) becomes the co
11b80 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
11b90 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
11ba0 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d  for a recursive-
11bb0 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20  query run.  The 
11bc0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65  output of the re
11bd0 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a  cursive-query.**
11be0 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69   is added back i
11bf0 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
11c00 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68  ble.  Then anoth
11c10 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63  er row is extrac
11c20 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a  ted from Queue.*
11c30 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  * and the iterat
11c40 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e  ion continues un
11c50 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61  til the Queue ta
11c60 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ble is empty..**
11c70 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f  .** If the compo
11c80 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74  und query operat
11c90 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e  or is UNION then
11ca0 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f   no duplicate ro
11cb0 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69  ws are ever.** i
11cc0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
11cd0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
11ce0 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62  he iDistinct tab
11cf0 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20  le keeps a copy 
11d00 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74  of all rows.** t
11d10 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65  hat have ever be
11d20 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
11d30 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65   Queue and cause
11d40 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20  s duplicates to 
11d50 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e  be.** discarded.
11d60 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f    If the operato
11d70 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  r is UNION ALL, 
11d80 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20  then duplicates 
11d90 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20  are allowed..** 
11da0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
11db0 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59   has an ORDER BY
11dc0 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69  , then entries i
11dd0 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  n the Queue tabl
11de0 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a  e are kept in.**
11df0 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20   ORDER BY order 
11e00 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e  and the first en
11e10 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64  try is extracted
11e20 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e   for each cycle.
11e30 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20    Without.** an 
11e40 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75  ORDER BY, the Qu
11e50 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73  eue table is jus
11e60 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20  t a FIFO..**.** 
11e70 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  If a LIMIT claus
11e80 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74  e is provided, t
11e90 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f  hen the iteratio
11ea0 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49  n stops after LI
11eb0 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65  MIT rows.** have
11ec0 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   been output to 
11ed0 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20  pDest.  A LIMIT 
11ee0 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f  of zero means to
11ef0 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20   output no rows 
11f00 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76  and a.** negativ
11f10 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f  e LIMIT means to
11f20 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73   output all rows
11f30 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
11f40 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c  lso an OFFSET cl
11f50 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70  ause.** with a p
11f60 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74  ositive value, t
11f70 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46  hen the first OF
11f80 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65  FSET outputs are
11f90 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65   discarded rathe
11fa0 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20  r.** than being 
11fb0 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20  sent to pDest.  
11fc0 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20  The LIMIT count 
11fd0 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75  does not begin u
11fe0 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45  ntil after OFFSE
11ff0 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62  T.** rows have b
12000 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  een skipped..*/.
12010 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
12020 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
12030 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  eQuery(.  Parse 
12040 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12050 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12060 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12070 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
12080 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53   The recursive S
12090 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65  ELECT to be code
120a0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
120b0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
120c0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
120d0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
120e0 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
120f0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20  Src = p->pSrc;  
12100 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
12110 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65  clause of the re
12120 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
12130 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
12140 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
12150 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
12160 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
12170 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a  ursive table */.
12180 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
12190 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
121a0 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
121b0 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
121c0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
121d0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70    Select *pSetup
121e0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20   = p->pPrior;   
121f0 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65  /* The setup que
12200 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ry */.  int addr
12210 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
12220 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
12230 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
12240 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  t addrCont, addr
12250 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43  Break;      /* C
12260 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41  ONTINUE and BREA
12270 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  K addresses */. 
12280 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
12290 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
122a0 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61  * The Current ta
122b0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
122c0 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
122d0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
122e0 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65  er holding Curre
122f0 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
12300 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20  t iQueue;       
12310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12320 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
12330 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63  /.  int iDistinc
12340 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
12350 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
12360 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
12370 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20   UNION */.  int 
12380 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f  eDest = SRT_Fifo
12390 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  ;         /* How
123a0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65   to write to Que
123b0 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ue */.  SelectDe
123c0 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20  st destQueue;   
123d0 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44        /* SelectD
123e0 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74  est targetting t
123f0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
12400 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
12430 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
12460 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ode */.  ExprLis
12470 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
12480 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
12490 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
124a0 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c  .  Expr *pLimit,
124b0 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20   *pOffset;      
124c0 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20   /* Saved LIMIT 
124d0 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20  and OFFSET */.  
124e0 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65  int regLimit, re
124f0 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  gOffset;      /*
12500 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20   Registers used 
12510 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  by LIMIT and OFF
12520 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  SET */..  /* Obt
12530 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ain authorizatio
12540 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73  n to do a recurs
12550 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
12560 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
12570 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
12580 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c  TE_RECURSIVE, 0,
12590 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
125a0 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
125b0 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
125c0 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20  SET clauses, if 
125d0 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  they exist */.  
125e0 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
125f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12600 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
12610 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
12620 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
12630 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
12640 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
12650 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
12660 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
12670 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74  Limit;.  pOffset
12680 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
12690 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69   regLimit = p->i
126a0 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73  Limit;.  regOffs
126b0 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
126c0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
126d0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
126e0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e   p->iLimit = p->
126f0 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
12700 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
12710 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  derBy;..  /* Loc
12720 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
12730 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72  umber of the Cur
12740 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
12750 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28  for(i=0; ALWAYS(
12760 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69  i<pSrc->nSrc); i
12770 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72  ++){.    if( pSr
12780 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63  c->a[i].fg.isRec
12790 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
127a0 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d  iCurrent = pSrc-
127b0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
127c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
127d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
127e0 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d  cate cursors num
127f0 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61  bers for Queue a
12800 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68  nd Distinct.  Th
12810 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
12820 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73  for.  ** the Dis
12830 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74  tinct table must
12840 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   be exactly one 
12850 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65  greater than Que
12860 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a  ue in order.  **
12870 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73   for the SRT_Dis
12880 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69  tFifo and SRT_Di
12890 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74  stQueue destinat
128a0 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f  ions to work. */
128b0 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72  .  iQueue = pPar
128c0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66  se->nTab++;.  if
128d0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
128e0 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  N ){.    eDest =
128f0 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
12900 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f  DistQueue : SRT_
12910 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44  DistFifo;.    iD
12920 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
12930 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73  ->nTab++;.  }els
12940 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  e{.    eDest = p
12950 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75  OrderBy ? SRT_Qu
12960 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a  eue : SRT_Fifo;.
12970 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
12980 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
12990 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69  tQueue, eDest, i
129a0 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c  Queue);..  /* Al
129b0 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66  locate cursors f
129c0 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75  or Current, Queu
129d0 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  e, and Distinct.
129e0 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74   */.  regCurrent
129f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12a00 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
12a10 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
12a20 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e  nPseudo, iCurren
12a30 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e  t, regCurrent, n
12a40 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  Col);.  if( pOrd
12a50 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
12a60 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
12a70 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
12a80 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
12a90 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  , p, 1);.    sql
12aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12ab0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12ac0 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  al, iQueue, pOrd
12ad0 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
12ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12af0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
12b00 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
12b10 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75  NFO);.    destQu
12b20 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  eue.pOrderBy = p
12b30 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65  OrderBy;.  }else
12b40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12b50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
12b60 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
12b70 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a  eue, nCol);.  }.
12b80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
12b90 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29  , "Queue table")
12ba0 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e  );.  if( iDistin
12bb0 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64  ct ){.    p->add
12bc0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73  rOpenEphm[0] = s
12bd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12be0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
12bf0 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c  eral, iDistinct,
12c00 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46   0);.    p->selF
12c10 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
12c20 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20  phemeral;.  }.. 
12c30 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f   /* Detach the O
12c40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
12c50 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  rom the compound
12c60 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e   SELECT */.  p->
12c70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
12c80 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
12c90 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74  sults of the set
12ca0 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75  up-query in Queu
12cb0 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e  e. */.  pSetup->
12cc0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20  pNext = 0;.  rc 
12cd0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
12ce0 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20  pParse, pSetup, 
12cf0 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70  &destQueue);.  p
12d00 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70  Setup->pNext = p
12d10 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
12d20 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  o end_of_recursi
12d30 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20  ve_query;..  /* 
12d40 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f  Find the next ro
12d50 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61  w in the Queue a
12d60 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72  nd output that r
12d70 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  ow */.  addrTop 
12d80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12d90 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
12da0 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72  , iQueue, addrBr
12db0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
12dc0 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61  ge(v);..  /* Tra
12dd0 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72  nsfer the next r
12de0 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72  ow in Queue over
12df0 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   to Current */. 
12e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e10 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
12e20 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20  , iCurrent); /* 
12e30 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20  To reset column 
12e40 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70  cache */.  if( p
12e50 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
12e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12e70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
12e80 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
12e90 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72  >nExpr+1, regCur
12ea0 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rent);.  }else{.
12eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12ec0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44  ddOp2(v, OP_RowD
12ed0 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67  ata, iQueue, reg
12ee0 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  Current);.  }.  
12ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f00 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
12f10 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f  iQueue);..  /* O
12f20 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65  utput the single
12f30 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
12f40 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  */.  addrCont = 
12f50 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
12f60 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f  abel(v);.  codeO
12f70 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73  ffset(v, regOffs
12f80 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  et, addrCont);. 
12f90 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
12fa0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 43 75 72  (pParse, p, iCur
12fb0 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30  rent,.      0, 0
12fc0 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e  , pDest, addrCon
12fd0 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
12fe0 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b   if( regLimit ){
12ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13000 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
13010 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69  rJumpZero, regLi
13020 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  mit, addrBreak);
13030 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
13040 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
13050 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
13060 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29  bel(v, addrCont)
13070 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  ;..  /* Execute 
13080 74 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  the recursive SE
13090 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20  LECT taking the 
130a0 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
130b0 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68  rrent as.  ** th
130c0 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
130d0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e  recursive-table.
130e0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
130f0 74 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e  ts in the Queue.
13100 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
13110 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
13120 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71  regate ){.    sq
13130 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13140 61 72 73 65 2c 20 22 72 65 63 75 72 73 69 76 65  arse, "recursive
13150 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
13160 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  es not supported
13170 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
13180 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
13190 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
131a0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
131b0 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73  stQueue);.    as
131c0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
131d0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  =0 );.    p->pPr
131e0 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20  ior = pSetup;.  
131f0 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e  }..  /* Keep run
13200 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e  ning the loop un
13210 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73  til the Queue is
13220 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69   empty */.  sqli
13230 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
13240 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
13250 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
13260 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
13270 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  ;..end_of_recurs
13280 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c  ive_query:.  sql
13290 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
132a0 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
132b0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
132c0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
132d0 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d  derBy;.  p->pLim
132e0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
132f0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
13300 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  set;.  return;.}
13310 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13320 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
13330 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
13340 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
13350 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
13360 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
13370 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
13380 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13390 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
133a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
133b0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
133c0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
133d0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
133e0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
133f0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
13400 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
13410 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48  s */.);../*.** H
13420 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61  andle the specia
13430 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70  l case of a comp
13440 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
13450 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
13460 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61   a.** VALUES cla
13470 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e  use.  By handlin
13480 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  g this as a spec
13490 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f  ial case, we avo
134a0 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72  id deep.** recur
134b0 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64  sion, and thus d
134c0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e  o not need to en
134d0 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45  force the SQLITE
134e0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
134f0 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56  SELECT.** on a V
13500 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a  ALUES clause..**
13510 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20  .** Because the 
13520 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72  Select object or
13530 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20  iginates from a 
13540 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a  VALUES clause:.*
13550 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e  *   (1) It has n
13560 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45  o LIMIT or OFFSE
13570 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74  T.**   (2) All t
13580 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41  erms are UNION A
13590 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72  LL.**   (3) Ther
135a0 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
135b0 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69   clause.*/.stati
135c0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
135d0 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65  tValues(.  Parse
135e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
135f0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13600 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
13610 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
13620 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
13630 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
13640 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
13650 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
13660 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
13670 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
13680 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lts */.){.  Sele
13690 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e  ct *pPrior;.  in
136a0 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
136b0 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t rc = 0;.  asse
136c0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
136d0 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
136e0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  );.  do{.    ass
136f0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
13700 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a   & SF_Values );.
13710 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
13720 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d  p==TK_ALL || (p-
13730 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
13740 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20  & p->pPrior==0) 
13750 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13760 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20  ->pLimit==0 );. 
13770 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13780 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ffset==0 );.    
13790 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74  assert( p->pNext
137a0 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74  ==0 || p->pEList
137b0 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78  ->nExpr==p->pNex
137c0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
137d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
137e0 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b  Prior==0 ) break
137f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
13800 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d  >pPrior->pNext==
13810 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  p );.    p = p->
13820 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77  pPrior;.    nRow
13830 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  ++;.  }while(1);
13840 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
13850 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70     pPrior = p->p
13860 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50  Prior;.    p->pP
13870 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  rior = 0;.    rc
13880 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13890 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
138a0 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  t);.    p->pPrio
138b0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
138c0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
138d0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
138e0 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20  w = nRow;.    p 
138f0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
13900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13910 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13920 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
13930 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
13940 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
13950 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
13960 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
13970 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
13980 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
13990 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
139a0 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
139b0 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
139c0 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
139d0 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
139e0 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
139f0 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
13a00 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
13a10 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
13a20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
13a30 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
13a40 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
13a50 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
13a60 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
13a70 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
13a80 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
13a90 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
13aa0 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
13ab0 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
13ac0 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
13ad0 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
13ae0 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
13af0 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
13b00 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
13b10 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
13b20 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
13b30 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
13b40 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
13b50 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
13b60 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
13b70 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
13b80 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
13b90 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
13ba0 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
13bb0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
13bc0 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
13bd0 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
13be0 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
13c10 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
13c20 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
13c30 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
13c40 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
13c50 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
13c60 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
13c70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13c80 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
13c90 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
13ca0 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
13cb0 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
13cc0 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
13cd0 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
13ce0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
13cf0 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
13d00 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
13d10 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
13d20 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
13d30 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
13d40 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
13d50 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
13d60 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
13d70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
13d80 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
13d90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
13da0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
13db0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
13dc0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13dd0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
13de0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
13df0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
13e00 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
13e10 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
13e20 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
13e30 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
13e40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13e50 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
13e60 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
13e70 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
13e80 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
13e90 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
13ea0 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
13eb0 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
13ec0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
13ed0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
13ee0 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
13ef0 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
13f00 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
13f10 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
13f20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
13f30 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
13f40 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
13f50 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
13f60 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
13f70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
13f80 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
13f90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13fa0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
13fb0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
13fc0 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20   int iSub1 = 0; 
13fd0 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
13fe0 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
13ff0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
14000 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  b2 = 0;        /
14010 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
14020 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
14030 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
14040 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
14050 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
14060 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
14070 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
14080 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
14090 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
140a0 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
140b0 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
140c0 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
140d0 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
140e0 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
140f0 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
14100 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
14110 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
14120 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
14130 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
14140 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d  ursive)==0 || p-
14150 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
14160 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
14170 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
14180 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
14190 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73  p->pPrior;.  des
141a0 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
141b0 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
141c0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
141d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
141e0 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
141f0 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
14200 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
14210 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
14220 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
14230 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
14240 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14250 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
14260 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
14270 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14280 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
14290 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
142a0 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
142b0 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
142c0 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
142d0 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
142e0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
142f0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
14300 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
14310 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14320 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
14330 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
14340 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
14350 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
14360 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
14370 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
14380 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
14390 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
143a0 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
143b0 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
143c0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
143d0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
143e0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
143f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14400 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
14410 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e  est.iSDParm, p->
14420 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
14430 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
14440 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
14450 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61  .  /* Special ha
14460 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d  ndling for a com
14470 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
14480 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20  t originates as 
14490 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  a VALUES clause.
144a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
144b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
144c0 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72  tiValue ){.    r
144d0 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 56  c = multiSelectV
144e0 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70 2c  alues(pParse, p,
144f0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f 74   &dest);.    got
14500 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
14510 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  nd;.  }..  /* Ma
14520 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
14530 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
14540 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
14550 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
14560 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
14570 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
14580 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
14590 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
145a0 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
145b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
145c0 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f  st->nExpr==pPrio
145d0 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
145e0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
145f0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69  ITE_OMIT_CTE.  i
14600 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
14610 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
14620 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74  .    generateWit
14630 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
14640 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
14650 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
14660 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  f..  /* Compound
14670 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
14680 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
14690 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
146a0 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
146b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
146c0 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
146d0 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
146e0 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
146f0 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   pDest);.  }else
14700 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14710 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
14720 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
14730 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
14740 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
14750 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
14760 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
14770 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
14780 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a      int nLimit;.
14790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
147a0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
147b0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
147c0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
147d0 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
147e0 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  >iOffset = p->iO
147f0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72  ffset;.      pPr
14800 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d  ior->pLimit = p-
14810 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
14820 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d  Prior->pOffset =
14830 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
14840 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14850 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
14860 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14870 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
14880 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
14890 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
148a0 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  st);.      p->pL
148b0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
148c0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
148d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
148e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
148f0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
14900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
14910 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
14920 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
14930 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
14940 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
14950 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
14960 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
14970 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
14980 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
14990 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
149a0 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74  IfNot, p->iLimit
149b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
149c0 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
149d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
149e0 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
149f0 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
14a00 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66       if( p->iOff
14a10 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  set ){.         
14a20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14a30 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c  p3(v, OP_OffsetL
14a40 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e    p->iLimit, p->
14a70 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f  iOffset+1, p->iO
14a80 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
14a90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14aa0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14ab0 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
14ac0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14ad0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14ae0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14af0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
14b00 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
14b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14b20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
14b30 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
14b40 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
14b50 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  r;.      p->nSel
14b60 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
14b70 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
14b80 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
14b90 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
14ba0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
14bb0 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26  pLimit.       &&
14bc0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
14bd0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
14be0 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20  imit, &nLimit). 
14bf0 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e        && nLimit>
14c00 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
14c10 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow > sqlite3LogE
14c20 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 20  st((u64)nLimit) 
14c30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
14c40 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
14c50 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
14c60 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20  (u64)nLimit);.  
14c70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14c80 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
14c90 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14ca0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
14cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
14cc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14cd0 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
14ce0 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
14cf0 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
14d00 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
14d10 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
14d20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14d30 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
14d40 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d  */.      u8 op =
14d50 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
14d60 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
14d70 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
14d80 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
14d90 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
14da0 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
14db0 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
14dc0 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
14dd0 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
14de0 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
14df0 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
14e00 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
14e10 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
14e20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
14e30 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
14e40 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
14e50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14e60 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
14e70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14e80 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
14e90 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
14ea0 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
14eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
14ec0 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
14ed0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
14ee0 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
14ef0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
14f00 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
14f10 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
14f20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
14f30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
14f40 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
14f50 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
14f60 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
14f70 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
14f80 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
14f90 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
14fa0 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   );     /* Not a
14fb0 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
14fc0 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
14fd0 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
14fe0 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
14ff0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15000 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
15010 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
15020 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
15030 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
15040 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
15050 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
15060 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
15070 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
15080 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
15090 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
150a0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
150b0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72   );.        addr
150c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
150d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
150e0 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
150f0 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
15100 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
15110 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
15120 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
15130 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
15140 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66   addr;.        f
15150 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
15160 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
15170 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
15180 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15190 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
151a0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
151b0 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
151c0 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
151d0 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
151e0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
151f0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
15200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
15210 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
15220 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
15230 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
15240 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
15250 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
15260 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
15270 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
15280 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
15290 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
152a0 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
152b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
152c0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
152d0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
152e0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
152f0 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
15300 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
15310 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
15320 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
15330 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
15340 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
15350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15360 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
15370 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
15380 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
15390 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
153a0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
153b0 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
153c0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
153d0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
153e0 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
153f0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
15400 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
15410 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
15420 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
15430 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15440 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
15450 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15460 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15470 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15480 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
15490 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
154a0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
154b0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
154c0 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
154d0 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
154e0 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
154f0 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
15500 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
15510 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
15520 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
15530 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
15540 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
15550 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
15560 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
15570 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
15580 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
15590 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
155a0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
155b0 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
155c0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
155d0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
155e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
155f0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
15600 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
15610 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
15620 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
15630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
15640 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
15650 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
15660 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
15670 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
15680 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
15690 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
156a0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
156b0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
156c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
156d0 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
156e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
156f0 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
15700 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
15710 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
15720 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
15730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
15740 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
15750 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
15760 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
15770 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
15780 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
15790 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
157a0 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
157b0 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
157c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
157d0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
157e0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
157f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15800 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
15810 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15820 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
15830 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
15840 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
15850 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
15860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15870 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
15880 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
15890 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
158a0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
158b0 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
158c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
158d0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  v);.        sele
158e0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
158f0 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  se, p, unionTab,
15900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15910 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
15920 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
15930 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
15940 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15950 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
15960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15970 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15980 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
15990 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
159a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
159b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
159c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
159d0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
159e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
159f0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
15a00 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
15a10 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
15a20 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
15a30 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  lt: assert( p->o
15a40 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
15a50 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  ); {.      int t
15a60 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
15a70 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
15a80 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
15a90 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
15aa0 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
15ab0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
15ac0 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
15ad0 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20  sectdest;.      
15ae0 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f  int r1;..      /
15af0 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
15b00 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
15b10 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
15b20 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
15b30 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
15b40 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
15b50 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
15b60 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
15b70 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
15b80 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
15b90 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
15ba0 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
15bb0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
15bc0 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
15bd0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15bf0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
15c00 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
15c10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15c20 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
15c30 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ral, tab1, 0);. 
15c40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15c50 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
15c60 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
15c70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
15c80 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
15c90 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
15ca0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
15cb0 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
15cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15cd0 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
15ce0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
15cf0 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
15d00 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
15d10 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
15d20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
15d30 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
15d40 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
15d50 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
15d60 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  ab1);.      expl
15d70 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
15d80 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
15d90 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
15da0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
15db0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
15dc0 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
15dd0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
15de0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
15df0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
15e00 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
15e10 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
15e20 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
15e30 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
15e40 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
15e50 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
15e60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15e70 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
15e80 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30  hemeral, tab2, 0
15e90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15ea0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
15eb0 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
15ec0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
15ed0 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
15ee0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
15ef0 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
15f00 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
15f10 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
15f20 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
15f30 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
15f40 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
15f50 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73   0;.      inters
15f60 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20  ectdest.iSDParm 
15f70 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78  = tab2;.      ex
15f80 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
15f90 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
15fa0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
15fb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15fc0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
15fd0 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  p, &intersectdes
15fe0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
15ff0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
16000 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
16010 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
16020 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
16030 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
16040 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
16050 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
16060 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
16070 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
16080 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
16090 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
160a0 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
160b0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
160c0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
160d0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
160e0 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20  pOffset;..      
160f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
16100 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
16110 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
16120 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
16130 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
16140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
16150 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
16160 20 29 3b 0a 20 20 20 20 20 20 69 42 72 65 61 6b   );.      iBreak
16170 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16180 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
16190 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
161a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
161b0 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
161c0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
161d0 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
161e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
161f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16200 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
16210 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
16220 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72  rage(v);.      r
16230 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
16240 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16250 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
16260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16270 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74  v, OP_RowData, t
16280 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ab1, r1);.      
16290 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
162a0 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
162b0 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
162c0 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f  , r1, 0); VdbeCo
162d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
162e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
162f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16300 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  1);.      select
16310 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
16320 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20  , p, tab1,.     
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
16350 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
16360 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
16370 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
16380 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
16390 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
163a0 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
163b0 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
163c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
163d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
163e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
163f0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
16400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16410 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
16420 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
16430 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16440 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
16450 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16460 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70      }.  }..  exp
16470 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
16480 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
16490 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70  b1, iSub2, p->op
164a0 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a  !=TK_ALL);..  /*
164b0 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69   Compute collati
164c0 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
164d0 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  d by .  ** tempo
164e0 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64  rary tables need
164f0 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
16500 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
16510 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68  ect..  ** Attach
16520 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
16530 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65  ucture to all te
16540 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a  mporary tables..
16550 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73    **.  ** This s
16560 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79  ection is run by
16570 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
16580 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16590 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45   only..  ** SELE
165a0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
165b0 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73   the left always
165c0 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e   skip this part.
165d0 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
165e0 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67  .  ** SELECT mig
165f0 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69  ht also skip thi
16600 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73  s part if it has
16610 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
16620 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20  use and.  ** no 
16630 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20  temp tables are 
16640 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
16650 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
16660 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65   & SF_UsesEpheme
16670 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ral ){.    int i
16680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16690 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
166a0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
166b0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
166c0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
166d0 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
166e0 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
166f0 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
16700 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
16710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16720 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
16730 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
16740 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
16750 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20  Seq **apColl;   
16760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
16770 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
16780 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
16790 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  [] */.    int nC
167a0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
167b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
167c0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
167d0 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
167e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
167f0 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43  ext==0 );.    nC
16800 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
16810 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
16820 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
16830 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43  InfoAlloc(db, nC
16840 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ol, 1);.    if( 
16850 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
16860 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
16870 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
16880 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16890 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
168a0 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
168b0 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
168c0 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
168d0 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
168e0 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
168f0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
16900 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
16910 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
16920 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
16930 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
16940 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
16950 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
16960 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
16970 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
16980 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
16990 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
169a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
169b0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
169c0 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
169d0 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
169e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
169f0 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
16a00 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
16a10 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
16a20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
16a30 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
16a40 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
16a50 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
16a60 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
16a70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16a80 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
16a90 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
16aa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
16ac0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16ad0 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
16ae0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16af0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
16b00 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73  , addr, (char*)s
16b10 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
16b20 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20  (pKeyInfo),.    
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b40 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
16b50 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
16b60 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
16b70 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
16b80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
16b90 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
16ba0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
16bb0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
16bc0 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74  :.  pDest->iSdst
16bd0 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
16be0 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
16bf0 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71  dest.nSdst;.  sq
16c00 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
16c10 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
16c20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
16c30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16c40 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
16c50 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45  LECT */../*.** E
16c60 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
16c70 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72   when two or mor
16c80 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d  e terms of a com
16c90 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76  pound select hav
16ca0 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73  e different.** s
16cb0 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e  ize result sets.
16cc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16cd0 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65  SelectWrongNumTe
16ce0 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a  rmsError(Parse *
16cf0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
16d00 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  p){.  if( p->sel
16d10 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
16d20 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
16d30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16d40 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
16d50 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
16d60 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
16d70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16d80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16d90 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
16da0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
16db0 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
16dc0 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
16dd0 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
16de0 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
16df0 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
16e00 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a  me(p->op));.  }.
16e10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
16e20 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
16e30 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
16e40 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
16e50 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
16e60 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
16e70 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
16e80 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
16e90 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
16ea0 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
16eb0 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
16ec0 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
16ed0 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
16ee0 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
16ef0 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
16f00 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
16f10 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
16f20 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
16f30 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
16f40 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
16f50 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
16f60 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
16f70 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
16f80 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
16f90 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
16fa0 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
16fb0 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
16fc0 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
16fd0 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
16fe0 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
16ff0 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
17000 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
17010 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
17020 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
17030 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
17040 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
17050 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
17060 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
17070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
17080 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
17090 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
170a0 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
170b0 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
170c0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
170d0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
170e0 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
170f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17100 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
17110 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
17120 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
17130 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
17140 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
17150 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
17160 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
17170 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
17180 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
17190 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
171a0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
171b0 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
171c0 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
171d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
171e0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
171f0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
17200 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
17210 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
17220 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
17230 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
17240 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
17250 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
17260 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
17270 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
17280 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
17290 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
172a0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
172b0 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
172c0 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
172d0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
172e0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
172f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
17300 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
17310 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
17320 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
17330 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
17340 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17350 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
17360 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
17370 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
17380 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
17390 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
173a0 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
173b0 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64  , addr2;.    add
173c0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
173d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
173e0 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
173f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17400 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
17410 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17420 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
17430 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
17440 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20  1, pIn->nSdst,. 
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
17470 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
17480 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
17490 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
174a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
174b0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
174c0 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  addr2+2, iContin
174d0 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64  ue, addr2+2); Vd
174e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
174f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
17500 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
17510 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17520 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
17530 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
17540 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
17550 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
17560 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17570 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
17580 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
17590 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
175a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
175b0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
175c0 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
175d0 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
175e0 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
175f0 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
17600 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
17610 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
17620 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
17630 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
17640 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
17650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
17660 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
17670 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63  Table );.  switc
17680 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
17690 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
176a0 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
176b0 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
176c0 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
176d0 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
176e0 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
176f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
17700 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17710 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20  .      int r2 = 
17720 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17730 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
17740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17750 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
17760 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
17770 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
17780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17790 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
177a0 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
177b0 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
177c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
177d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
177e0 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
177f0 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
17800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
17810 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
17820 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
17830 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17840 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17850 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
17860 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17870 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
17880 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17890 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
178a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
178b0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
178c0 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
178d0 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
178e0 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20  ELECT ...)"..   
178f0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
17900 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
17910 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74  t r1;.      test
17920 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
17930 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  >1 );.      r1 =
17940 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17950 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17970 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
17980 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
17990 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20  , pIn->nSdst, . 
179a0 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65           r1, pDe
179b0 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49  st->zAffSdst, pI
179c0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
179d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
179e0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
179f0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
17a00 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
17a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17a20 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
17a30 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
17a40 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
17a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a60 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d              pIn-
17a70 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17a80 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
17a90 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17aa0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
17ab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17ac0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
17ad0 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
17ae0 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
17af0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
17b00 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
17b10 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
17b20 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
17b30 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
17b40 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
17b50 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
17b60 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
17b70 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
17b80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17b90 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c  pIn->nSdst==1 ||
17ba0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
17bb0 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49  );  testcase( pI
17bc0 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20  n->nSdst!=1 );. 
17bd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17be0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
17bf0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
17c00 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b  st->iSDParm, 1);
17c10 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
17c20 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
17c30 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
17c40 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
17c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17c60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
17c70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17c80 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
17c90 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20   /* The results 
17ca0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
17cb0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
17cc0 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
17cd0 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e  rting at pDest->
17ce0 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65  iSdst.  Then the
17cf0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
17d00 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
17d10 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
17d20 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
17d30 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
17d40 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
17d50 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33  >iSdst = sqlite3
17d60 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
17d70 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  rse, pIn->nSdst)
17d80 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
17d90 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53  >nSdst = pIn->nS
17da0 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dst;.      }.   
17db0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17dc0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
17dd0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
17de0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17df0 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
17e00 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
17e10 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
17e20 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
17e30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
17e40 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
17e50 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
17e60 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
17e70 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
17e80 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
17e90 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
17ea0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
17eb0 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
17ec0 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
17ed0 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
17ee0 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
17ef0 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
17f00 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
17f10 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
17f20 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
17f30 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
17f40 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
17f50 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
17f60 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
17f70 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
17f80 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
17f90 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
17fa0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
17fb0 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
17fc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
17fd0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
17fe0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
17ff0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
18000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18010 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
18020 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
18030 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
18040 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18050 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
18060 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
18070 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
18080 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62  >nSdst);.      b
18090 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
180a0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
180b0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
180c0 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
180d0 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
180e0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
180f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
18100 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
18110 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e  ecrJumpZero, p->
18120 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
18130 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18140 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
18150 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74  rate the subrout
18160 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  ine return.  */.
18170 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18180 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
18190 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74  ntinue);.  sqlit
181a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
181b0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
181c0 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e  turn);..  return
181d0 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
181e0 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70  Alternative comp
181f0 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65  ound select code
18200 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63   generator for c
18210 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a  ases when there.
18220 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  ** is an ORDER B
18230 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
18240 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72  We assume a quer
18250 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
18260 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ng form:.**.**  
18270 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c      <selectA>  <
18280 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65  operator>  <sele
18290 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c  ctB>  ORDER BY <
182a0 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a  orderbylist>.**.
182b0 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
182c0 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c   one of UNION AL
182d0 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  L, UNION, EXCEPT
182e0 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20  , or INTERSECT. 
182f0 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20   The idea.** is 
18300 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65  to code both <se
18310 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65  lectA> and <sele
18320 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52  ctB> with the OR
18330 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
18340 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e  .** co-routines.
18350 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63    Then run the c
18360 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61  o-routines in pa
18370 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65  rallel and merge
18380 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
18390 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  into the output.
183a0 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
183b0 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
183c0 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65  nes (called sele
183d0 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63  ctA and.** selec
183e0 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20  tB) there are 7 
183f0 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a  subroutines:.**.
18400 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d  **    outA:    M
18410 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
18420 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f  f the selectA co
18430 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
18440 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
18450 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
18460 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a  mpound query..**
18470 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20  .**    outB:    
18480 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
18490 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63  of the selectB c
184a0 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
184b0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
184c0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
184d0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20  ompound query.  
184e0 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20  (Only generated 
184f0 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a  for UNION and.**
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
18510 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20  ON ALL.  EXCEPT 
18520 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e  and INSERTSECT n
18530 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f  ever output a ro
18540 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  w that.**       
18550 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e        appears on
18560 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20  ly in B.).**.** 
18570 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c     AltB:    Call
18580 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
18590 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
185a0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
185b0 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71  <B..**.**    Aeq
185c0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
185d0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
185e0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
185f0 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a  ines and A==B..*
18600 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20  *.**    AgtB:   
18610 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
18620 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
18630 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
18640 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A>B..**.**  
18650 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65    EofA:    Calle
18660 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
18670 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
18680 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lectA..**.**    
18690 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofB:    Called 
186a0 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
186b0 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
186c0 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ctB..**.** The i
186d0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
186e0 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65   the latter five
186f0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70   subroutines dep
18700 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a  end on which .**
18710 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75   <operator> is u
18720 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20  sed:.**.**.**   
18730 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
18740 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f  ALL         UNIO
18750 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43  N            EXC
18760 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54  EPT          INT
18770 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  ERSECT.**       
18780 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
18790 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
187a0 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
187b0 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
187c0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42  ------.**   AltB
187d0 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
187e0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
187f0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
18800 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
18810 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20  .**.**   AeqB:  
18820 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
18830 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
18840 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
18850 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
18860 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20  .**.**   AgtB:  
18870 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
18880 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
18890 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20         nextB    
188a0 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a          nextB.**
188b0 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75  .**   EofA:   ou
188c0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
188d0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
188e0 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20      halt        
188f0 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
18900 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20    EofB:   outA, 
18910 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
18920 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
18930 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
18940 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74   halt.**.** In t
18950 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61  he AltB, AeqB, a
18960 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69  nd AgtB subrouti
18970 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41  nes, an EOF on A
18980 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41   following nextA
18990 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d  .** causes an im
189a0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
189b0 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20  EofA and an EOF 
189c0 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on B following n
189d0 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61  extB causes.** a
189e0 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
189f0 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69   to EofB.  Withi
18a00 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c  n EofA and EofB,
18a10 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72   and EOF on entr
18a20 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  y or.** followin
18a30 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61  g nextX causes a
18a40 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   jump to the end
18a50 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70   of the select p
18a60 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
18a70 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   Duplicate remov
18a80 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c  al in the UNION,
18a90 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
18aa0 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20  ERSECT cases is 
18ab0 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69  handled.** withi
18ac0 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  n the output sub
18ad0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65  routine.  The re
18ae0 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73  gPrev register s
18af0 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65  et holds the pre
18b00 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75  viously.** outpu
18b10 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70  t value.  A comp
18b20 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61  arison is made a
18b30 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75  gainst this valu
18b40 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  e and the output
18b50 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69  .** is skipped i
18b60 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c  f the next resul
18b70 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20  ts would be the 
18b80 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76  same as the prev
18b90 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ious..**.** The 
18ba0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
18bb0 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d  lan is to implem
18bc0 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f  ent the two coro
18bd0 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e  utines and seven
18be0 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20  .** subroutines 
18bf0 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20  first, then put 
18c00 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69  the control logi
18c10 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e  c at the bottom.
18c20 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
18c30 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  **          goto
18c40 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41   Init.**     coA
18c50 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
18c60 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a  left query (A).*
18c70 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75  *     coB: corou
18c80 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71  tine for right q
18c90 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f  uery (B).**    o
18ca0 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utA: output one 
18cb0 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f  row of A.**    o
18cc0 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utB: output one 
18cd0 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20  row of B (UNION 
18ce0 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e  and UNION ALL on
18cf0 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  ly).**    EofA: 
18d00 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  ....**    EofB: 
18d10 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  ....**    AltB: 
18d20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  ....**    AeqB: 
18d30 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  ....**    AgtB: 
18d40 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20  ....**    Init: 
18d50 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75  initialize corou
18d60 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tine registers.*
18d70 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
18d80 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20   coA.**         
18d90 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20   if eof(A) goto 
18da0 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  EofA.**         
18db0 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20   yield coB.**   
18dc0 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29         if eof(B)
18dd0 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20   goto EofB.**   
18de0 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41   Cmpr: Compare A
18df0 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  , B.**          
18e00 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c  Jump AltB, AeqB,
18e10 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64   AgtB.**     End
18e20 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63  : ....**.** We c
18e30 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  all AltB, AeqB, 
18e40 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20  AgtB, EofA, and 
18e50 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65  EofB "subroutine
18e60 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20  s" but they are 
18e70 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20  not.** actually 
18e80 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73  called using Gos
18e90 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e  ub and they do n
18ea0 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41  ot Return.  EofA
18eb0 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a   and EofB loop.*
18ec0 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61  * until all data
18ed0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68   is exhausted th
18ee0 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22  en jump to the "
18ef0 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42  end" labe.  AltB
18f00 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41  , AeqB,.** and A
18f10 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68  gtB jump to eith
18f20 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20  er L2 or to one 
18f30 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e  of EofA or EofB.
18f40 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
18f50 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
18f60 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69  _SELECT.static i
18f70 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
18f80 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
18f90 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
18fa0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
18fb0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
18fc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18fd0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
18fe0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
18ff0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
19000 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
19010 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
19020 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
19030 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
19040 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
19050 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
19060 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
19070 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
19080 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
19090 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
190a0 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
190b0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
190c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
190d0 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
190e0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
190f0 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73  estA;     /* Des
19100 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
19110 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65  outine A */.  Se
19120 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20  lectDest destB; 
19130 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
19140 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
19150 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41   B */.  int regA
19160 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrA;         /*
19170 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
19180 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63  r for select-A c
19190 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
191a0 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
191b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
191c0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
191d0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
191e0 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
191f0 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctA;      /* Add
19200 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
19210 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
19220 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
19230 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctB;      /* Add
19240 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
19250 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
19260 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b  /.  int regOutA;
19270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
19280 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
19290 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  r the output-A s
192a0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
192b0 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20  nt regOutB;     
192c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
192d0 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
192e0 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
192f0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
19300 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  drOutA;         
19310 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19320 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
19330 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19340 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20  ddrOutB = 0;    
19350 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
19360 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
19370 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
19380 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20  addrEofA;       
19390 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
193a0 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68  the select-A-exh
193b0 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
193c0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
193d0 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20  ofA_noB;     /* 
193e0 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f  Alternate addrEo
193f0 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69  fA if B is unini
19400 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e  tialized */.  in
19410 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20  t addrEofB;     
19420 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19430 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65  f the select-B-e
19440 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
19450 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
19460 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAltB;         /
19470 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
19480 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A<B subroutine 
19490 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71  */.  int addrAeq
194a0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
194b0 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d  dress of the A==
194c0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
194d0 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20    int addrAgtB; 
194e0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
194f0 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75  ss of the A>B su
19500 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
19510 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20  t regLimitA;    
19520 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
19530 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
19540 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  -A */.  int regL
19550 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a  imitB;        /*
19560 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
19570 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
19580 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
19590 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e          /* A ran
195a0 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
195b0 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73  to hold previous
195c0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
195d0 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20   savedLimit;    
195e0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
195f0 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a  e of p->iLimit *
19600 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66  /.  int savedOff
19610 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76  set;      /* Sav
19620 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
19630 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  Offset */.  int 
19640 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20  labelCmpr;      
19650 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
19660 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
19670 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
19680 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e  */.  int labelEn
19690 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  d;         /* La
196a0 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20  bel for the end 
196b0 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53  of the overall S
196c0 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20  ELECT stmt */.  
196d0 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
196e0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e        /* Jump in
196f0 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
19700 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20  get retargetted 
19710 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
19720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
19730 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f  e of TK_ALL, TK_
19740 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
19750 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a  , TK_INTERSECT *
19760 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
19770 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d  yDup = 0; /* Com
19780 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
19790 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
197a0 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b  e removal */.  K
197b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67  eyInfo *pKeyMerg
197c0 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73  e;   /* Comparis
197d0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
197e0 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20  or merging rows 
197f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
19800 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
19810 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19820 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
19830 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
19840 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
19850 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  use */.  int nOr
19860 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
19870 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
19880 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
19890 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
198a0 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20  t *aPermute;    
198b0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
198c0 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72  rom ORDER BY ter
198d0 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74  ms to result set
198e0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e   columns */.#ifn
198f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19900 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53  EXPLAIN.  int iS
19910 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub1;            
19920 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66  /* EQP id of lef
19930 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
19940 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20    int iSub2;    
19950 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
19960 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  d of right-hand 
19970 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a  query */.#endif.
19980 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
19990 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
199a0 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d  ssert( pKeyDup==
199b0 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64  0 ); /* "Managed
199c0 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69  " code needs thi
199d0 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32  s.  Ticket #3382
199e0 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  . */.  db = pPar
199f0 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50  se->db;.  v = pP
19a00 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
19a10 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
19a20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20       /* Already 
19a30 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72  thrown the error
19a40 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66   if VDBE alloc f
19a50 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c  ailed */.  label
19a60 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
19a70 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
19a80 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c   labelCmpr = sql
19a90 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
19aa0 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74  l(v);...  /* Pat
19ab0 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20  ch up the ORDER 
19ac0 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  BY clause.  */. 
19ad0 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20   op = p->op;  . 
19ae0 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
19af0 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
19b00 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d  Prior->pOrderBy=
19b10 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  =0 );.  pOrderBy
19b20 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
19b30 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
19b40 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  By );.  nOrderBy
19b50 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
19b60 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
19b70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
19b80 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
19b90 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
19ba0 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
19bb0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
19bc0 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
19bd0 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
19be0 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
19bf0 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
19c00 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
19c10 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
19c20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
19c30 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
19c40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19c50 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
19c60 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
19c70 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
19c80 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
19c90 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  tem;.      for(j
19ca0 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
19cb0 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42  By->a; j<nOrderB
19cc0 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; j++, pItem++)
19cd0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
19ce0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
19cf0 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
19d00 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
19d10 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19d20 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
19d30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
19d40 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
19d50 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
19d60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
19d70 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
19d80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19d90 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
19da0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
19db0 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  T;.        pNew-
19dc0 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
19dd0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
19de0 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
19df0 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  i;.        p->pO
19e00 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
19e10 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
19e20 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
19e30 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77  , pOrderBy, pNew
19e40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19e50 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72  OrderBy ) pOrder
19e60 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
19e70 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
19e80 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20  l = (u16)i;.    
19e90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
19ea0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
19eb0 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75  comparison permu
19ec0 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e  tation and keyin
19ed0 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20  fo that is used 
19ee0 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65  with.  ** the pe
19ef0 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74  rmutation used t
19f00 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
19f10 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77  he next.  ** row
19f20 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65   of results come
19f30 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f  s from selectA o
19f40 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f  r selectB.  Also
19f50 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20   add explicit.  
19f60 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f  ** collations to
19f70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19f80 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68  ause terms so th
19f90 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71  at when the subq
19fa0 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74  ueries.  ** to t
19fb0 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65  he right and the
19fc0 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61   left are evalua
19fd0 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68  ted, they use th
19fe0 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63  e correct.  ** c
19ff0 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ollation..  */. 
1a000 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69   aPermute = sqli
1a010 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
1a020 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
1a030 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29  *(nOrderBy + 1))
1a040 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
1a050 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
1a060 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1a070 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74  tem;.    aPermut
1a080 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b  e[0] = nOrderBy;
1a090 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49  .    for(i=1, pI
1a0a0 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
1a0b0 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b   i<=nOrderBy; i+
1a0c0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1a0d0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1a0e0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1a0f0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  l>0 );.      ass
1a100 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
1a110 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e  iOrderByCol<=p->
1a120 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1a130 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
1a140 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  i] = pItem->u.x.
1a150 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
1a160 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
1a170 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65  erge = multiSele
1a180 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
1a190 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
1a1a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
1a1b0 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
1a1c0 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
1a1d0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1a1e0 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
1a1f0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
1a200 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
1a210 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
1a220 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1a230 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
1a240 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
1a250 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1a260 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
1a270 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
1a280 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
1a290 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
1a2a0 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
1a2b0 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
1a2c0 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
1a2d0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
1a2e0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
1a2f0 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
1a300 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
1a310 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
1a320 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
1a330 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
1a340 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1a350 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
1a360 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1a370 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
1a380 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
1a390 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a3a0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
1a3b0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1a3c0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1a3d0 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73  = nExpr+1;.    s
1a3e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a3f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1a400 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
1a410 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
1a420 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
1a430 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
1a440 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
1a450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
1a460 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
1a470 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70  riteable(pKeyDup
1a480 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) );.      for(i
1a490 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
1a4a0 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
1a4b0 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
1a4c0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
1a4d0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
1a4e0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
1a4f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1a500 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1a510 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
1a520 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
1a530 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
1a540 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
1a550 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
1a560 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72  Prior = 0;.  pPr
1a570 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ior->pNext = 0;.
1a580 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1a590 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
1a5a0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
1a5b0 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
1a5c0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
1a5d0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
1a5e0 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
1a5f0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
1a600 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
1a610 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
1a620 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
1a630 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
1a640 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
1a650 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
1a660 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
1a670 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
1a680 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
1a690 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
1a6a0 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
1a6b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1a6c0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
1a6d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1a6e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a6f0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
1a700 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
1a710 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
1a720 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
1a750 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1a760 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a770 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
1a780 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
1a790 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
1a7a0 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
1a7b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1a7c0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1a7d0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
1a7e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1a7f0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1a800 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
1a810 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
1a820 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
1a830 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a840 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
1a850 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1a860 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
1a870 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1a880 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
1a890 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
1a8a0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1a8b0 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
1a8c0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
1a8d0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1a8e0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
1a8f0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1a900 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
1a910 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1a920 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1a930 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1a940 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
1a950 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
1a960 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
1a970 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
1a980 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ct..  */.  addrS
1a990 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
1a9a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1a9b0 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20  v) + 1;.  addr1 
1a9c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a9d0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
1a9e0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1a9f0 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  A, 0, addrSelect
1aa00 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  A);.  VdbeCommen
1aa10 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45  t((v, "left SELE
1aa20 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
1aa30 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
1aa40 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65  itA;.  explainSe
1aa50 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
1aa60 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
1aa70 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
1aa80 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
1aa90 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b  pPrior, &destA);
1aaa0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  .  sqlite3VdbeEn
1aab0 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65  dCoroutine(v, re
1aac0 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
1aad0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1aae0 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20  , addr1);..  /* 
1aaf0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
1ab00 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
1ab10 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1ab20 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
1ab30 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
1ab40 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
1ab50 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
1ab60 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1ab70 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
1ab80 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
1ab90 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1aba0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1abb0 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72  egAddrB, 0, addr
1abc0 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65  SelectB);.  Vdbe
1abd0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67  Comment((v, "rig
1abe0 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ht SELECT"));.  
1abf0 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e  savedLimit = p->
1ac00 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f  iLimit;.  savedO
1ac10 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
1ac20 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  et;.  p->iLimit 
1ac30 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70  = regLimitB;.  p
1ac40 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20  ->iOffset = 0;  
1ac50 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
1ac60 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
1ac70 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
1ac80 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
1ac90 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
1aca0 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
1acb0 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
1acc0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1acd0 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
1ace0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
1acf0 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64  routine(v, regAd
1ad00 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
1ad10 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1ad20 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
1ad30 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1ad40 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
1ad50 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
1ad60 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
1ad70 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1ad80 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
1ad90 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
1ada0 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
1adb0 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
1adc0 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
1add0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
1ade0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1adf0 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
1ae00 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
1ae10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ae20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
1ae30 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
1ae40 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
1ae50 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1ae60 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
1ae70 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
1ae80 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
1ae90 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
1aea0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
1aeb0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
1aec0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1aed0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1aee0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
1aef0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1af00 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
1af10 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
1af20 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
1af30 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
1af40 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1af50 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
1af60 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
1af70 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
1af80 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
1af90 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
1afa0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
1afb0 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
1afc0 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65  eyDup);..  /* Ge
1afd0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1afe0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1aff0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1b000 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
1b010 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1b020 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1b030 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
1b040 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1b050 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
1b060 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1b070 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
1b080 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61   = addrEofA = la
1b090 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  belEnd;.  }else{
1b0a0 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
1b0b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
1b0c0 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
1b0d0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
1b0e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b0f0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1b100 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
1b110 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  );.    addrEofA_
1b120 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  noB = sqlite3Vdb
1b130 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b140 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c  eld, regAddrB, l
1b150 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20  abelEnd);.      
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
1b180 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1b1a0 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29  oto(v, addrEofA)
1b1b0 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
1b1c0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
1b1d0 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
1b1e0 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
1b1f0 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a  electRow);.  }..
1b200 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1b210 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
1b220 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
1b230 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42  ts from select B
1b240 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
1b250 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
1b260 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65  a in select A re
1b270 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
1b280 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
1b290 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
1b2a0 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20  fB = addrEofA;. 
1b2b0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
1b2c0 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e  tRow > pPrior->n
1b2d0 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
1b2e0 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
1b2f0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
1b300 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1b310 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1b320 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75  v, "eof-B subrou
1b330 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1b340 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56  rEofB = sqlite3V
1b350 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b360 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
1b370 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
1b380 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b390 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1b3a0 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64  gAddrA, labelEnd
1b3b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b3c0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1b3d0 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  dbeGoto(v, addrE
1b3e0 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofB);.  }..  /* 
1b3f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1b400 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1b410 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56   of A<B.  */.  V
1b420 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1b430 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f  v, "A-lt-B subro
1b440 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
1b450 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AltB = sqlite3Vd
1b460 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1b470 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
1b480 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69  ddrOutA);.  sqli
1b490 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b4a0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b4b0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1b4c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b4d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
1b4e0 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1b4f0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1b500 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1b510 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42  the case of A==B
1b520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1b530 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64  TK_ALL ){.    ad
1b540 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
1b550 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  B;.  }else if( o
1b560 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1b570 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1b580 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20  = addrAltB;.    
1b590 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65  addrAltB++;.  }e
1b5a0 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  lse{.    VdbeNoo
1b5b0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1b5c0 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  eq-B subroutine"
1b5d0 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42  ));.    addrAeqB
1b5e0 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   =.    sqlite3Vd
1b5f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b600 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1b610 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
1b620 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b630 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1b640 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
1b650 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1b660 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1b670 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
1b680 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1b690 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
1b6a0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1b6b0 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
1b6c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1b6d0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
1b6e0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
1b6f0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
1b700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b710 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1b720 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
1b730 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
1b740 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b750 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b760 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1b770 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b780 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
1b790 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1b7a0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
1b7b0 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69  e runs once to i
1b7c0 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74  nitialize everyt
1b7d0 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  hing..  */.  sql
1b7e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1b7f0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71  (v, addr1);.  sq
1b800 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b810 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b820 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f  AddrA, addrEofA_
1b830 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  noB); VdbeCovera
1b840 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1b850 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b860 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1b870 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1b880 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1b890 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
1b8a0 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
1b8b0 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
1b8c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1b8d0 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1b8e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b8f0 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
1b900 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
1b910 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
1b920 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
1b930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b940 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
1b950 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64  , destA.iSdst, d
1b960 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64  estB.iSdst, nOrd
1b970 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b990 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c  char*)pKeyMerge,
1b9a0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
1b9b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1b9c0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45  eP5(v, OPFLAG_PE
1b9d0 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65  RMUTE);.  sqlite
1b9e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1b9f0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42  P_Jump, addrAltB
1ba00 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72  , addrAeqB, addr
1ba10 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72  AgtB); VdbeCover
1ba20 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75  age(v);..  /* Ju
1ba30 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70  mp to the this p
1ba40 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
1ba50 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   terminate the q
1ba60 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  uery..  */.  sql
1ba70 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1ba80 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64  abel(v, labelEnd
1ba90 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d  );..  /* Reassem
1baa0 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  bly the compound
1bab0 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69   query so that i
1bac0 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
1bad0 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62  correctly.  ** b
1bae0 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
1baf0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
1bb00 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
1bb10 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1bb20 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69  lete(db, p->pPri
1bb30 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50  or);.  }.  p->pP
1bb40 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1bb50 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
1bb60 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a   p;..  /*** TBD:
1bb70 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74    Insert subrout
1bb80 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f  ine calls to clo
1bb90 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e  se cursors on in
1bba0 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20  complete.  **** 
1bbb0 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f  subqueries ****/
1bbc0 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
1bbd0 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
1bbe0 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
1bbf0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50   0);.  return pP
1bc00 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d  arse->nErr!=0;.}
1bc10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
1bc20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1bc30 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1bc40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1bc50 4d 49 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e  MIT_VIEW)../* An
1bc60 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1bc70 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 6f 62   SubstContext ob
1bc80 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20 61  ject describes a
1bc90 6e 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 65  n substitution e
1bca0 64 69 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72  dit.** to be per
1bcb0 66 6f 72 6d 65 64 20 6f 6e 20 61 20 70 61 72 73  formed on a pars
1bcc0 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  e tree..**.** Al
1bcd0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
1bce0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
1bcf0 20 69 54 61 62 6c 65 20 61 72 65 20 74 6f 20 62   iTable are to b
1bd00 65 20 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f  e replaced by co
1bd10 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65  rresponding.** e
1bd20 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 45  xpressions in pE
1bd30 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  List..*/.typedef
1bd40 20 73 74 72 75 63 74 20 53 75 62 73 74 43 6f 6e   struct SubstCon
1bd50 74 65 78 74 20 7b 0a 20 20 50 61 72 73 65 20 2a  text {.  Parse *
1bd60 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1bd70 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
1bd80 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
1bd90 6e 74 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20  nt iTable;      
1bda0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c           /* Repl
1bdb0 61 63 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ace references t
1bdc0 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
1bdd0 20 20 69 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b    int iNewTable;
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1bdf0 65 77 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  ew table number 
1be00 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a  */.  int isLeftJ
1be10 6f 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oin;           /
1be20 2a 20 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c  * Add TK_IF_NULL
1be30 5f 52 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20  _ROW opcodes on 
1be40 65 61 63 68 20 72 65 70 6c 61 63 65 6d 65 6e 74  each replacement
1be50 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1be60 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
1be70 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 65  /* Replacement e
1be80 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20  xpressions */.} 
1be90 53 75 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f  SubstContext;../
1bea0 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
1beb0 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
1bec0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1bed0 69 73 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74  ist(SubstContext
1bee0 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
1bef0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1bf00 53 65 6c 65 63 74 28 53 75 62 73 74 43 6f 6e 74  Select(SubstCont
1bf10 65 78 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69  ext*, Select*, i
1bf20 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  nt);../*.** Scan
1bf30 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
1bf40 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
1bf50 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
1bf60 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
1bf70 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
1bf80 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
1bf90 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
1bfa0 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
1bfb0 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
1bfc0 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
1bfd0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
1bfe0 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
1bff0 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
1c000 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1c010 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
1c020 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
1c030 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
1c040 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
1c050 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
1c060 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
1c070 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
1c080 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
1c090 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
1c0a0 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
1c0b0 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1c0c0 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
1c0d0 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
1c0e0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
1c0f0 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65  ine makes the ne
1c100 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
1c110 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
1c120 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
1c130 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
1c140 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
1c150 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
1c160 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
1c170 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
1c180 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
1c190 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
1c1a0 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  .  SubstContext 
1c1b0 2a 70 53 75 62 73 74 2c 20 20 2f 2a 20 44 65 73  *pSubst,  /* Des
1c1c0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1c1d0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1c1e0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
1c1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
1c200 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
1c210 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
1c220 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  .){.  if( pExpr=
1c230 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1c240 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1c250 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
1c260 72 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 45 78 70  romJoin) && pExp
1c270 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1c280 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1c290 6c 65 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  le ){.    pExpr-
1c2a0 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c2b0 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54   = pSubst->iNewT
1c2c0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
1c2d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1c2e0 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
1c2f0 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69  Table==pSubst->i
1c300 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
1c310 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1c320 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
1c330 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
1c340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c350 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
1c360 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d     Expr *pCopy =
1c370 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d   pSubst->pEList-
1c380 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
1c390 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
1c3a0 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a  Expr ifNullRow;.
1c3b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1c3c0 75 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20  ubst->pEList!=0 
1c3d0 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
1c3e0 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74  n<pSubst->pEList
1c3f0 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1c400 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c410 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
1c420 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
1c430 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c440 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43  3ExprIsVector(pC
1c450 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  opy) ){.        
1c460 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
1c470 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50  orMsg(pSubst->pP
1c480 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20  arse, pCopy);.  
1c490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c4a0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1c4b0 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d   pSubst->pParse-
1c4c0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >db;.        if(
1c4d0 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1c4e0 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70  oin && pCopy->op
1c4f0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
1c500 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1c510 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73  &ifNullRow, 0, s
1c520 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29  izeof(ifNullRow)
1c530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e  );.          ifN
1c540 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49  ullRow.op = TK_I
1c550 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20  F_NULL_ROW;.    
1c560 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1c570 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20  pLeft = pCopy;. 
1c580 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1c590 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  ow.iTable = pSub
1c5a0 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1c5b0 20 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d           pCopy =
1c5c0 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20   &ifNullRow;.   
1c5d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1c5e0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1c5f0 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20  rDup(db, pCopy, 
1c600 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1c610 70 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e  pNew && pSubst->
1c620 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  isLeftJoin ){.  
1c630 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
1c640 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
1c650 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20  _CanBeNull);.   
1c660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1c670 66 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48  f( pNew && ExprH
1c680 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c690 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b  ,EP_FromJoin) ){
1c6a0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1c6b0 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c6c0 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74   = pExpr->iRight
1c6d0 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20  JoinTable;.     
1c6e0 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
1c6f0 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72  erty(pNew, EP_Fr
1c700 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20  omJoin);.       
1c710 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1c720 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1c730 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
1c740 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
1c750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c760 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45  else{.    if( pE
1c770 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e  xpr->op==TK_IF_N
1c780 55 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72  ULL_ROW && pExpr
1c790 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74  ->iTable==pSubst
1c7a0 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
1c7b0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1c7c0 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61  = pSubst->iNewTa
1c7d0 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ble;.    }.    p
1c7e0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75  Expr->pLeft = su
1c7f0 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1c800 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c810 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1c820 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1c830 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  bst, pExpr->pRig
1c840 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
1c850 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c860 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1c870 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
1c880 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1c890 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
1c8a0 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
1c8b0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1c8c0 69 73 74 28 70 53 75 62 73 74 2c 20 70 45 78 70  ist(pSubst, pExp
1c8d0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1c8e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c8f0 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20  pExpr;.}.static 
1c900 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1c910 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65  st(.  SubstConte
1c920 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44  xt *pSubst, /* D
1c930 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1c940 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a  e substitution *
1c950 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1c960 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist       /* Lis
1c970 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e  t to scan and in
1c980 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
1c990 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b  ubstitutes */.){
1c9a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1c9b0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1c9c0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1c9d0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1c9e0 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
1c9f0 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
1ca00 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c  tExpr(pSubst, pL
1ca10 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1ca20 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
1ca30 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1ca40 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  .  SubstContext 
1ca50 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63  *pSubst, /* Desc
1ca60 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ription of the s
1ca70 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  ubstitution */. 
1ca80 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1ca90 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
1caa0 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
1cab0 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1cac0 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
1cad0 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20  nt doPrior      
1cae0 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74       /* Do subst
1caf0 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72  itutes on p->pPr
1cb00 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20  ior too */.){.  
1cb10 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
1cb20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1cb30 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1cb40 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29  nt i;.  if( !p )
1cb50 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20   return;.  do{. 
1cb60 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1cb70 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69  (pSubst, p->pELi
1cb80 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
1cb90 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70  prList(pSubst, p
1cba0 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
1cbb0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1cbc0 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72  Subst, p->pOrder
1cbd0 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  By);.    p->pHav
1cbe0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1cbf0 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69  pSubst, p->pHavi
1cc00 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ng);.    p->pWhe
1cc10 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  re = substExpr(p
1cc20 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65  Subst, p->pWhere
1cc30 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d  );.    pSrc = p-
1cc40 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72  >pSrc;.    asser
1cc50 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
1cc60 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1cc70 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
1cc80 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
1cc90 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
1cca0 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c  stSelect(pSubst,
1ccb0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
1ccc0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
1ccd0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1cce0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75  nc ){.        su
1ccf0 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1cd00 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46  st, pItem->u1.pF
1cd10 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  uncArg);.      }
1cd20 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1cd30 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d   doPrior && (p =
1cd40 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29   p->pPrior)!=0 )
1cd50 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
1cd60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1cd70 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1cd80 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1cd90 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
1cda0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1cdb0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1cdc0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1cdd0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1cde0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1cdf0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
1ce00 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
1ce10 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s as a performan
1ce20 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
1ce30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ce40 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
1ce50 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
1ce60 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
1ce70 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a  ening occurs..**
1ce80 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
1ce90 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
1cea0 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
1ceb0 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1cec0 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
1ced0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
1cee0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
1cef0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1cf00 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
1cf10 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
1cf20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
1cf30 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
1cf40 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
1cf50 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
1cf60 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
1cf70 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1cf80 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1cf90 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
1cfa0 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
1cfb0 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
1cfc0 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
1cfd0 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
1cfe0 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
1cff0 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
1d000 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
1d010 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1d020 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
1d030 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
1d040 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
1d050 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
1d060 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
1d070 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1d080 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1d090 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
1d0a0 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
1d0b0 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
1d0c0 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
1d0d0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1d0e0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
1d0f0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1d100 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
1d110 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1d120 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1d130 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  is simplificatio
1d140 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1d150 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1d160 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1d170 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1d180 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1d190 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1d1a0 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1d1b0 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1d1c0 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1d1d0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1d1e0 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1d1f0 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
1d200 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
1d210 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1d220 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1d230 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
1d240 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1d250 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1d260 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
1d270 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
1d280 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1d290 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1d2a0 74 65 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f  te or (2a) the o
1d2b0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1d2c0 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  t a join.**     
1d2d0 20 20 20 61 6e 64 20 28 32 62 29 20 74 68 65 20     and (2b) the 
1d2e0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1d2f0 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65 72   not use subquer
1d300 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ies other than t
1d310 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  he one.**       
1d320 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1d330 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20  query that is a 
1d340 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c  candidate for fl
1d350 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69  attening.  (2b i
1d360 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20  s.**        due 
1d370 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37  to ticket [2f717
1d380 30 64 37 33 62 66 39 61 62 66 38 30 5d 20 66 72  0d73bf9abf80] fr
1d390 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a  om 2015-02-09.).
1d3a0 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
1d3b0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1d3c0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1d3d0 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
1d3e0 4e 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 28  N.**        or (
1d3f0 61 29 20 74 68 65 20 73 75 62 71 75 65 72 79 20  a) the subquery 
1d400 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20  is not itself a 
1d410 6a 6f 69 6e 20 61 6e 64 20 28 62 29 20 74 68 65  join and (b) the
1d420 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
1d430 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 73 75         of the su
1d440 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1d450 63 6f 6e 74 61 69 6e 20 61 20 76 69 72 74 75 61  contain a virtua
1d460 6c 20 74 61 62 6c 65 20 61 6e 64 20 28 63 29 20  l table and (c) 
1d470 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f  the .**        o
1d480 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1d490 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a  t an aggregate..
1d4a0 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
1d4b0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1d4c0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1d4d0 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70    (**)  At one p
1d4e0 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e  oint restriction
1d4f0 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65  s (4) and (5) de
1d500 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f  fined a subset o
1d510 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20  f DISTINCT.**   
1d520 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73       sub-queries
1d530 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75   that were exclu
1d540 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70  ded from this op
1d550 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74  timization. Rest
1d560 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  riction .**     
1d570 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65     (4) has since
1d580 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74   been expanded t
1d590 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49  o exclude all DI
1d5a0 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65  STINCT subquerie
1d5b0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
1d5c0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1d5d0 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
1d5e0 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
1d5f0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
1d600 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
1d610 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
1d620 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
1d630 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
1d640 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
1d650 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
1d660 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
1d670 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
1d680 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
1d690 6c 61 75 73 65 20 77 69 74 68 20 74 68 65 20 73  lause with the s
1d6a0 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
1d6b0 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
1d6c0 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
1d6d0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
1d6e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1d6f0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
1d700 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
1d710 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1d720 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1d730 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1d740 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
1d750 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
1d760 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1d770 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1d780 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1d790 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1d7a0 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
1d7b0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1d7c0 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20  *)  Restriction 
1d7d0 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64  (10) was removed
1d7e0 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f   from the code o
1d7f0 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74  n 2005-02-05 but
1d800 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63   we.**        ac
1d810 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64  cidently carried
1d820 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72   the comment for
1d830 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d  ward until 2014-
1d840 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c  09-15.  Original
1d850 0a 2a 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a  .**        text:
1d860 20 22 54 68 65 20 73 75 62 71 75 65 72 79 20 64   "The subquery d
1d870 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
1d880 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
1d890 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20  ter query .**   
1d8a0 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 75 73       does not us
1d8b0 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20  e LIMIT.".**.** 
1d8c0 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
1d8d0 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1d8e0 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1d8f0 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
1d900 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
1d910 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c    (**)  Not impl
1d920 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
1d930 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1d940 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
1d950 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
1d960 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
1d970 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
1d980 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
1d990 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
1d9a0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1d9b0 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  nd outer query d
1d9c0 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  o not both use L
1d9d0 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
1d9e0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1d9f0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
1da00 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  SET..**.**  (15)
1da10 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1da20 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  y is not part of
1da30 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1da40 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  ct or the.**    
1da50 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65      subquery doe
1da60 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d  s not have a LIM
1da70 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  IT clause..**   
1da80 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
1da90 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
1daa0 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
1dab0 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68  .**.**  (16)  Th
1dac0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1dad0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1dae0 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72  e or the subquer
1daf0 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20  y does.**       
1db00 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44   not contain ORD
1db10 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
1db20 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
1db30 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
1db40 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
1db50 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
1db60 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
1db70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
1db80 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75  **  (17)  The su
1db90 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1dba0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1dbb0 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49  , or it is a UNI
1dbc0 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20  ON ALL .**      
1dbd0 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73    compound claus
1dbe0 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65  e made up entire
1dbf0 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67  ly of non-aggreg
1dc00 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64  ate queries, and
1dc10 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20   .**        the 
1dc20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a  parent query:.**
1dc30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1dc40 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72  s not itself par
1dc50 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1dc60 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20  select,.**      
1dc70 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20      * is not an 
1dc80 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53  aggregate or DIS
1dc90 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64  TINCT query, and
1dca0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1dcb0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a  s not a join.**.
1dcc0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
1dcd0 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
1dce0 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
1dcf0 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
1dd00 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
1dd10 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
1dd20 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
1dd30 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
1dd40 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
1dd50 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
1dd60 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
1dd70 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
1dd80 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
1dd90 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1dda0 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
1ddb0 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
1ddc0 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
1ddd0 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
1dde0 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1ddf0 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
1de00 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
1de10 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
1de20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
1de30 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
1de40 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
1de50 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1de60 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1de70 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
1de80 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
1de90 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
1dea0 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
1deb0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
1dec0 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
1ded0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1dee0 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
1def0 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
1df00 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
1df10 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
1df20 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
1df30 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
1df40 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
1df50 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
1df60 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
1df70 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
1df80 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
1df90 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
1dfa0 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
1dfb0 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
1dfc0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1dfd0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1dfe0 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1dff0 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
1e000 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74  R by clause of t
1e010 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
1e020 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
1e030 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
1e040 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
1e050 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
1e060 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62  *  (19)  The sub
1e070 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1e080 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1e090 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1e0a0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
1e0b0 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
1e0c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20  se..**.**  (20) 
1e0d0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1e0e0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1e0f0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20  select, then it 
1e100 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  must not use.** 
1e110 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20         an ORDER 
1e120 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b  BY clause.  Tick
1e130 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f  et #3773.  We co
1e140 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63  uld relax this c
1e150 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20  onstraint.**    
1e160 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20      somewhat by 
1e170 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20  saying that the 
1e180 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1e190 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73  ER BY clause mus
1e1a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65  t.**        appe
1e1b0 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64  ar as unmodified
1e1c0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
1e1d0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1e1e0 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20  ry.  But we.**  
1e1f0 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
1e200 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
1e210 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
1e220 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
1e230 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20  *.**  (21)  The 
1e240 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1e250 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1e260 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1e270 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1e280 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
1e290 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
1e2a0 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32  fc])..**.**  (22
1e2b0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1e2c0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
1e2d0 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28  ve CTE..**.**  (
1e2e0 32 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20  23)  The parent 
1e2f0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
1e300 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73  ve CTE, or the s
1e310 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20  ub-query is not 
1e320 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70  a.**        comp
1e330 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73  ound query. This
1e340 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20   restriction is 
1e350 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72  because transfor
1e360 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ming the.**     
1e370 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63     parent to a c
1e380 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f  ompound query co
1e390 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20  nfuses the code 
1e3a0 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20  that handles.** 
1e3b0 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65         recursive
1e3c0 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74   queries in mult
1e3d0 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a  iSelect()..**.**
1e3e0 20 20 28 32 34 29 20 20 54 68 65 20 73 75 62 71    (24)  The subq
1e3f0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
1e400 67 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73  ggregate that us
1e410 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  es the built-in 
1e420 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20  min() or .**    
1e430 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e      or max() fun
1e440 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75  ctions.  (Withou
1e450 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
1e460 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65  on, a query like
1e470 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c  :.**        "SEL
1e480 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45  ECT x FROM (SELE
1e490 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f  CT max(y), x FRO
1e4a0 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74  M t1)" would not
1e4b0 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20   necessarily.** 
1e4c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
1e4d0 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68  e value X for wh
1e4e0 69 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61  ich Y was maxima
1e4f0 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20  l.).**.**.** In 
1e500 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
1e510 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
1e520 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1e530 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1e540 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
1e550 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
1e560 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
1e570 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
1e580 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
1e590 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20   aggregates and 
1e5a0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73  subqueryIsAgg is
1e5b0 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62   true if the sub
1e5c0 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
1e5d0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
1e5e0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
1e5f0 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
1e600 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1e610 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
1e620 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
1e630 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
1e640 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
1e650 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
1e660 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
1e670 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
1e680 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
1e690 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
1e6a0 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
1e6b0 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
1e6c0 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
1e6d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
1e6e0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
1e6f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1e700 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1e710 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1e720 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1e730 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
1e740 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
1e750 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
1e760 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
1e770 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1e780 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
1e790 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
1e7a0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
1e7b0 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
1e7c0 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
1e7d0 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
1e7e0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
1e7f0 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
1e800 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
1e810 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
1e820 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
1e830 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
1e840 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1e850 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
1e860 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
1e870 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
1e880 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a   *pParent;    /*
1e890 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41   Current UNION A
1e8a0 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f  LL term of the o
1e8b0 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  ther query */.  
1e8c0 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
1e8d0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
1e8e0 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
1e8f0 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
1e900 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
1e910 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
1e920 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
1e930 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
1e940 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1e950 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
1e960 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1e970 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1e980 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
1e990 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
1e9a0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1e9b0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
1e9c0 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
1e9d0 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
1e9e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
1e9f0 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
1ea00 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
1ea10 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20  nt iNewParent = 
1ea20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e  -1;/* Replacemen
1ea30 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72  t table for iPar
1ea40 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ent */.  int isL
1ea50 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20  eftJoin = 0; /* 
1ea60 54 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20  True if pSub is 
1ea70 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
1ea80 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f  f a LEFT JOIN */
1ea90 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20      .  int i;   
1eaa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1eab0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1eac0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1eaf0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1eb00 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1eb10 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
1eb20 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1eb30 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1eb40 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
1eb50 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1eb60 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1eb70 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
1eb80 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
1eb90 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
1eba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1ebb0 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20  Prior==0 );  /* 
1ebc0 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65  Unable to flatte
1ebd0 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69  n compound queri
1ebe0 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  es */.  if( Opti
1ebf0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1ec00 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
1ec10 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
1ec20 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
1ec30 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
1ec40 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
1ec50 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
1ec60 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
1ec70 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
1ec80 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
1ec90 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
1eca0 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
1ecb0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1ecc0 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
1ecd0 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
1ece0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1ecf0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
1ed00 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ed30 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 20 2a  triction (1)   *
1ed40 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
1ed50 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
1ed60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ed70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ed80 73 74 72 69 63 74 69 6f 6e 20 28 32 61 29 20 20  striction (2a)  
1ed90 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  */.    if( (p->p
1eda0 57 68 65 72 65 20 26 26 20 45 78 70 72 48 61 73  Where && ExprHas
1edb0 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 57 68 65  Property(p->pWhe
1edc0 72 65 2c 45 50 5f 53 75 62 71 75 65 72 79 29 29  re,EP_Subquery))
1edd0 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  .     || (sqlite
1ede0 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
1edf0 2d 3e 70 45 4c 69 73 74 29 20 26 20 45 50 5f 53  ->pEList) & EP_S
1ee00 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20  ubquery)!=0.    
1ee10 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72   || (sqlite3Expr
1ee20 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72  ListFlags(p->pOr
1ee30 64 65 72 42 79 29 20 26 20 45 50 5f 53 75 62 71  derBy) & EP_Subq
1ee40 75 65 72 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a  uery)!=0.    ){.
1ee50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1ee90 72 69 63 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f  riction (2b)  */
1eea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 53  .    }.  }..  pS
1eeb0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1eec0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1eed0 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
1eee0 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
1eef0 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
1ef00 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
1ef10 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
1ef20 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
1ef30 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1ef40 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
1ef50 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
1ef60 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
1ef70 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
1ef80 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
1ef90 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
1efa0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
1efb0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1efc0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
1efd0 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
1efe0 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
1eff0 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
1f000 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
1f010 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
1f020 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1f030 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
1f040 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
1f050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f060 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
1f070 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1f080 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
1f090 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f0b0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
1f0c0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
1f0d0 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
1f0e0 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d  und)!=0 && pSub-
1f0f0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
1f100 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f140 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
1f150 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1f160 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
1f170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f180 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1f190 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
1f1a0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1f1b0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1f1c0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1f1d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1f1e0 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20  iction (5)  */. 
1f1f0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1f200 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
1f210 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
1f220 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1f230 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1f240 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
1f250 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1f260 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1f270 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
1f280 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1f290 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1f2a0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1f2b0 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
1f2c0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1f2d0 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1f2e0 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1f2f0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f330 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1f340 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1f350 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1f360 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1f370 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f380 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1f390 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1f3a0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1f3b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f3c0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f3d0 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1f3e0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1f3f0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1f400 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1f410 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1f420 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1f430 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1f440 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
1f450 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1f460 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
1f470 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53  ;.  testcase( pS
1f480 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1f490 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20  F_MinMaxAgg );. 
1f4a0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1f4b0 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
1f4c0 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67  ive|SF_MinMaxAgg
1f4d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1f4e0 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1f4f0 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34 29  ns (22) and (24)
1f500 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
1f510 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f520 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53  Recursive) && pS
1f530 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1f540 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1f550 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20  estriction (23) 
1f560 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  */.  }..  /*.  *
1f570 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
1f580 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1f590 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54  perand of a LEFT
1f5a0 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a   JOIN, then the.
1f5b0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 6d 61    ** subquery ma
1f5c0 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20  y not be a join 
1f5d0 69 74 73 65 6c 66 2e 20 20 45 78 61 6d 70 6c 65  itself.  Example
1f5e0 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
1f5f0 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
1f600 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
1f610 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1f620 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
1f630 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1f640 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1f650 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1f660 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1f670 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1f680 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
1f690 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
1f6a0 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
1f6b0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
1f6c0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
1f6d0 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1f6e0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1f6f0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68   a LEFT JOIN, th
1f700 65 6e 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a  en the outer.  *
1f710 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  * query cannot b
1f720 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  e an aggregate. 
1f730 20 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69   This is an arti
1f740 66 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 20  fact of the way 
1f750 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2a 20  aggregates.  ** 
1f760 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20  are processed - 
1f770 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68  there is no mech
1f780 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69  anism to determi
1f790 6e 65 20 69 66 20 74 68 65 20 4c 45 46 54 20 4a  ne if the LEFT J
1f7a0 4f 49 4e 0a 20 20 2a 2a 20 74 61 62 6c 65 20 73  OIN.  ** table s
1f7b0 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c  hould be all-NUL
1f7c0 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  L..  **.  ** See
1f7d0 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33   also tickets #3
1f7e0 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33  06, #350, and #3
1f7f0 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  300..  */.  if( 
1f800 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f  (pSubitem->fg.jo
1f810 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1f820 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c  R)!=0 ){.    isL
1f830 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20  eftJoin = 1;.   
1f840 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1f850 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c  rc>1 || isAgg ||
1f860 20 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53   IsVirtual(pSubS
1f870 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29  rc->a[0].pTab) )
1f880 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1f890 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e  ; /* Restriction
1f8a0 20 28 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20   (3) */.    }.  
1f8b0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1f8c0 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a  EXTRA_IFNULLROW.
1f8d0 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d    else if( iFrom
1f8e0 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a  >0 && !isAgg ){.
1f8f0 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69      /* Setting i
1f900 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20  sLeftJoin to -1 
1f910 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c  causes OP_IfNull
1f920 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  Row opcodes to b
1f930 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a  e generated for.
1f940 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66      ** every ref
1f950 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65  erence to any re
1f960 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  sult column from
1f970 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a   subquery in a j
1f980 6f 69 6e 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  oin, even though
1f990 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65  .    ** they are
1f9a0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
1f9b0 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73   This will stres
1f9c0 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66  s-test the OP_If
1f9d0 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 2e 20  NullRow opcode. 
1f9e0 2a 2f 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69  */.    isLeftJoi
1f9f0 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  n = -1;.  }.#end
1fa00 69 66 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  if..  /* Restric
1fa10 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20  tion 17: If the 
1fa20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1fa30 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
1fa40 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
1fa50 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
1fa60 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1fa70 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
1fa80 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
1fa90 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
1faa0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
1fab0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
1fac0 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
1fad0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
1fae0 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
1faf0 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
1fb00 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1fb10 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
1fb20 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1fb30 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
1fb40 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a  striction 20 */.
1fb50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
1fb60 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  Agg || (p->selFl
1fb70 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1fb80 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e  t)!=0 || pSrc->n
1fb90 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  Src!=1 ){.      
1fba0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1fbb0 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53      for(pSub1=pS
1fbc0 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31  ub; pSub1; pSub1
1fbd0 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b  =pSub1->pPrior){
1fbe0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fbf0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1fc00 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1fc10 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1fc20 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
1fc30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fc40 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1fc50 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1fc60 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1fc70 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
1fc80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1fc90 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20  ub->pSrc!=0 );. 
1fca0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1fcb0 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
1fcc0 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d  ==pSub1->pEList-
1fcd0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1fce0 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  if( (pSub1->selF
1fcf0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1fd00 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1fd10 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ))!=0.       || 
1fd20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
1fd30 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
1fd40 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  ALL) .       || 
1fd50 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1fd60 63 3c 31 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  c<1.      ){.   
1fd70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1fd80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
1fd90 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53  tcase( pSub1->pS
1fda0 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20  rc->nSrc>1 );.  
1fdb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74    }..    /* Rest
1fdc0 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20  riction 18. */. 
1fdd0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1fde0 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
1fdf0 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
1fe00 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72  =0; ii<p->pOrder
1fe10 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
1fe20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
1fe30 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  >pOrderBy->a[ii]
1fe40 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
1fe50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1fe60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fe70 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77  }..  /***** If w
1fe80 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
1fe90 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  nt, flattening i
1fea0 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a  s permitted. ***
1feb0 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43  **/.  SELECTTRAC
1fec0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66  E(1,pParse,p,("f
1fed0 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f  latten %s.%p fro
1fee0 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20  m term %d\n",.  
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff00 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c   pSub->zSelName,
1ff10 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a   pSub, iFrom));.
1ff20 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20  .  /* Authorize 
1ff30 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1ff40 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1ff50 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65  ontext = pSubite
1ff60 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54  m->zName;.  TEST
1ff70 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65  ONLY(i =) sqlite
1ff80 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1ff90 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
1ffa0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65  , 0, 0, 0);.  te
1ffb0 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54  stcase( i==SQLIT
1ffc0 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72  E_DENY );.  pPar
1ffd0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1ffe0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
1fff0 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
20000 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
20010 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
20020 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
20030 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
20040 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
20050 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
20060 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
20070 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
20080 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
20090 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
200a0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
200b0 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
200c0 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
200d0 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
200e0 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
200f0 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
20100 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
20110 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
20120 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
20130 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
20140 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
20150 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
20160 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
20170 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
20180 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
20190 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
201a0 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
201b0 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
201c0 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
201d0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
201e0 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
201f0 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
20200 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
20210 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
20220 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
20230 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
20240 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
20250 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
20260 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
20270 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
20280 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
20290 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
202a0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
202b0 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
202c0 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
202d0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
202e0 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
202f0 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
20300 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
20310 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
20320 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
20330 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
20340 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
20350 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
20360 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
20370 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
20380 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
20390 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
203a0 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
203b0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
203c0 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
203d0 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
203e0 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
203f0 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
20400 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
20410 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
20420 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
20430 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
20440 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
20450 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
20460 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
20470 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
20480 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
20490 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
204a0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
204b0 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
204c0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
204d0 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73  .    Expr *pOffs
204e0 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
204f0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
20500 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
20510 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
20520 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
20530 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
20540 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
20550 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
20560 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
20570 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
20580 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
20590 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   p, 0);.    sqli
205a0 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
205b0 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65  (pNew, pSub->zSe
205c0 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70  lName);.    p->p
205d0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
205e0 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
205f0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d  = pLimit;.    p-
20600 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
20610 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72  erBy;.    p->pSr
20620 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d  c = pSrc;.    p-
20630 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20  >op = TK_ALL;.  
20640 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
20650 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
20660 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = pPrior;.    }
20670 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
20680 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
20690 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  r;.      if( pPr
206a0 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e  ior ) pPrior->pN
206b0 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ext = pNew;.    
206c0 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
206d0 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  p;.      p->pPri
206e0 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  or = pNew;.     
206f0 20 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70   SELECTTRACE(2,p
20700 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20  Parse,p,.       
20710 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62    ("compound-sub
20720 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20  query flattener 
20730 63 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73  creates %s.%p as
20740 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20   peer\n",.      
20750 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d     pNew->zSelNam
20760 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d  e, pNew));.    }
20770 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
20780 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
20790 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
207a0 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67  Begin flattening
207b0 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e   the iFrom-th en
207c0 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
207d0 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20  clause .  ** in 
207e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
207f0 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  .  */.  pSub = p
20800 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d  Sub1 = pSubitem-
20810 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
20820 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73  Delete the trans
20830 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
20840 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20  ture associated 
20850 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
20860 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71  bquery.  */.  sq
20870 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
20880 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
20890 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ase);.  sqlite3D
208a0 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
208b0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  em->zName);.  sq
208c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
208d0 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
208e0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  );.  pSubitem->z
208f0 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
20900 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
20910 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
20920 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70  >zAlias = 0;.  p
20930 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
20940 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65   = 0;..  /* Defe
20950 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54  r deleting the T
20960 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f  able object asso
20970 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
20980 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e    ** subquery un
20990 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
209a0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  ion is.  ** comp
209b0 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72  lete, since ther
209c0 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73  e may still exis
209d0 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72  t Expr.pTab entr
209e0 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  ies that.  ** re
209f0 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75  fer to the subqu
20a00 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66  ery even after f
20a10 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b  lattening.  Tick
20a20 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20  et #3346..  **. 
20a30 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54   ** pSubitem->pT
20a40 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e  ab is always non
20a50 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65  -NULL by test re
20a60 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74  strictions and t
20a70 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f  ests above..  */
20a80 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
20a90 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29  ubitem->pTab!=0)
20aa0 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
20ab0 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69  TabToDel = pSubi
20ac0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
20ad0 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54  f( pTabToDel->nT
20ae0 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20  abRef==1 ){.    
20af0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
20b00 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
20b10 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
20b20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  );.      pTabToD
20b30 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20  el->pNextZombie 
20b40 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f  = pToplevel->pZo
20b50 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70  mbieTab;.      p
20b60 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69  Toplevel->pZombi
20b70 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c  eTab = pTabToDel
20b80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20b90 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54     pTabToDel->nT
20ba0 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20  abRef--;.    }. 
20bb0 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61     pSubitem->pTa
20bc0 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 0;.  }..  /*
20bd0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
20be0 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
20bf0 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61  r each term in a
20c00 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
20c10 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  ry.  ** flatteni
20c20 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64  ng (as described
20c30 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20   above).  If we 
20c40 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66  are doing a diff
20c50 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20  erent kind.  ** 
20c60 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20  of flattening - 
20c70 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68  a flattening oth
20c80 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75  er than a compou
20c90 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
20ca0 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68  tening -.  ** th
20cb0 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  en this loop onl
20cc0 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
20cd0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
20ce0 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68   moves all of th
20cf0 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
20d00 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
20d10 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
20d20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
20d30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20d40 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
20d50 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
20d60 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
20d70 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
20d80 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
20d90 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
20da0 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
20db0 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
20dc0 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
20dd0 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
20de0 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
20df0 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
20e00 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
20e10 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
20e20 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
20e30 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
20e40 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
20e50 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
20e60 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
20e70 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
20e80 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
20e90 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
20ea0 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74  */.  for(pParent
20eb0 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61  =p; pParent; pPa
20ec0 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50  rent=pParent->pP
20ed0 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d  rior, pSub=pSub-
20ee0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e  >pPrior){.    in
20ef0 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75  t nSubSrc;.    u
20f00 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  8 jointype = 0;.
20f10 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
20f20 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  ub->pSrc;     /*
20f30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
20f40 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
20f50 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
20f60 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d  c->nSrc;  /* Num
20f70 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
20f80 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  subquery FROM cl
20f90 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63  ause */.    pSrc
20fa0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
20fb0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
20fc0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
20fd0 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20  r query */..    
20fe0 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
20ff0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
21000 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73  t==p );  /* Firs
21010 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74  t time through t
21020 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
21030 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
21040 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
21050 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
21060 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
21070 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
21080 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
21090 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
210a0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
210b0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
210c0 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
210d0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
210e0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
210f0 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
21100 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21110 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
21120 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
21130 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
21140 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
21150 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
21160 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
21170 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
21180 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
21190 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
211a0 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
211b0 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
211c0 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
211d0 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
211e0 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
211f0 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
21200 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
21210 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
21220 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
21230 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
21240 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
21250 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
21260 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
21270 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
21280 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
21290 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
212a0 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
212b0 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
212c0 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
212d0 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
212e0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
212f0 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
21300 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
21310 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
21320 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
21330 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
21340 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
21350 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
21360 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20   FROM clause to 
21370 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20  4 slots..    ** 
21380 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20  The middle slot 
21390 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
213a0 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
213b0 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a  r to make space.
213c0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74      ** for the t
213d0 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
213e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
213f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
21400 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
21410 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
21420 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
21430 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  = pSrc = sqlite3
21440 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
21450 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63  b, pSrc, nSubSrc
21460 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20  -1,iFrom+1);.   
21470 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
21480 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
21490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
214a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
214b0 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f  Transfer the FRO
214c0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  M clause terms f
214d0 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
214e0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
214f0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
21500 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
21510 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
21520 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21530 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
21540 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
21550 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20  ].pUsing);.     
21560 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61   assert( pSrc->a
21570 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54  [i+iFrom].fg.isT
21580 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
21590 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
215a0 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
215b0 5b 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50  [i];.      iNewP
215c0 61 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d  arent = pSubSrc-
215d0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
215e0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
215f0 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
21600 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
21610 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
21620 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
21630 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  fg.jointype = jo
21640 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f  intype;.  .    /
21650 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
21660 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
21670 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
21680 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
21690 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
216a0 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
216b0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
216c0 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  y..    ** .    *
216d0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
216e0 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
216f0 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
21700 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
21710 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
21720 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
21730 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  .    **   \     
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21750 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
21760 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
21770 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
21780 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f     **    \______
21790 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
217a0 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
217b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
217c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20  __________/.    
217d0 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f  **.    ** We loo
217e0 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
217f0 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
21800 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
21810 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
21820 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75      ** "a" we su
21830 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
21840 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
21850 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
21860 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
21870 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
21880 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
21890 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69  .      /* At thi
218a0 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e  s point, any non
218b0 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f  -zero iOrderByCo
218c0 6c 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74  l values indicat
218d0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
218e0 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c   ** ORDER BY col
218f0 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  umn expression i
21900 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74  s identical to t
21910 68 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74  he iOrderByCol't
21920 68 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  h.      ** expre
21930 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62  ssion returned b
21940 79 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  y SELECT stateme
21950 6e 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74  nt pSub. Since t
21960 68 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20  hese values.    
21970 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65    ** do not nece
21980 73 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f  ssarily correspo
21990 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  nd to columns in
219a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
219b0 74 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20  t pParent,.     
219c0 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65   ** zero them be
219d0 66 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67  fore transfering
219e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
219f0 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ause..      **. 
21a00 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e       ** Not doin
21a10 67 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65  g this may cause
21a20 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73   an error if a s
21a30 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74  ubsequent call t
21a40 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  o this.      ** 
21a50 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
21a60 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63  s to flatten a c
21a70 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
21a80 79 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20  y into pParent. 
21a90 20 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c       ** (the onl
21aa0 79 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  y way this can h
21ab0 61 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20  appen is if the 
21ac0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
21ad0 72 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63  ry is.      ** c
21ae0 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66  urrently part of
21af0 20 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65   pSub->pSrc). Se
21b00 65 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65  e ticket [d11a6e
21b10 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20  908f].  */.     
21b20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
21b30 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
21b40 65 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28  erBy;.      for(
21b50 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
21b60 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
21b70 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
21b80 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
21b90 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
21ba0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
21bb0 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
21bc0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  y==0 );.      as
21bd0 73 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69  sert( pSub->pPri
21be0 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  or==0 );.      p
21bf0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
21c00 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
21c10 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
21c20 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 0;.    }.   
21c30 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
21c40 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
21c50 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  b->pWhere, 0);. 
21c60 20 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69     if( isLeftJoi
21c70 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74  n>0 ){.      set
21c80 4a 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c  JoinExpr(pWhere,
21c90 20 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20   iNewParent);.  
21ca0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71    }.    if( subq
21cb0 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
21cc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21cd0 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29  nt->pHaving==0 )
21ce0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
21cf0 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65  >pHaving = pPare
21d00 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  nt->pWhere;.    
21d10 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
21d20 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
21d30 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
21d40 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
21d50 41 6e 64 28 64 62 2c 20 0a 20 20 20 20 20 20 20  And(db, .       
21d60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
21d70 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
21d80 69 6e 67 2c 20 30 29 2c 20 70 50 61 72 65 6e 74  ing, 0), pParent
21d90 2d 3e 70 48 61 76 69 6e 67 0a 20 20 20 20 20 20  ->pHaving.      
21da0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21db0 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
21dc0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
21dd0 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
21de0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
21df0 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  stDup(db, pSub->
21e00 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20  pGroupBy, 0);.  
21e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21e20 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
21e30 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
21e40 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72  db, pWhere, pPar
21e50 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  ent->pWhere);.  
21e60 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
21e70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
21e80 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f  ){.      SubstCo
21e90 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78  ntext x;.      x
21ea0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
21eb0 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65  ;.      x.iTable
21ec0 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20   = iParent;.    
21ed0 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20    x.iNewTable = 
21ee0 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20  iNewParent;.    
21ef0 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d    x.isLeftJoin =
21f00 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20   isLeftJoin;.   
21f10 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
21f20 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ub->pEList;.    
21f30 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 26 78    substSelect(&x
21f40 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20  , pParent, 0);. 
21f50 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
21f60 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
21f70 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
21f80 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
21f90 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
21fa0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
21fb0 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
21fc0 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
21fd0 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
21fe0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
21ff0 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20  istinct;.  .    
22000 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
22010 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
22020 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
22030 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
22040 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
22050 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
22060 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
22070 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
22080 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
22090 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
220a0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
220b0 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
220c0 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
220d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
220e0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
220f0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
22100 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
22110 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
22120 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
22130 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
22140 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
22150 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
22160 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
22170 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
22180 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
22190 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
221a0 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20  b, pSub1);..#if 
221b0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
221c0 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
221d0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
221e0 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x100 ){.    SELE
221f0 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
22200 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66  arse,p,("After f
22210 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b  lattening:\n"));
22220 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
22230 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
22240 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
22250 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
22260 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
22270 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
22280 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
22290 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
222a0 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20  VIEW) */....#if 
222b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
222c0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
222d0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
222e0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a  E_OMIT_VIEW)./*.
222f0 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  ** Make copies o
22300 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45  f relevant WHERE
22310 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
22320 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
22330 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45   into.** the WHE
22340 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62  RE clause of sub
22350 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a  query.  Example:
22360 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
22370 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
22380 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79  a AS x, c-d AS y
22390 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
223a0 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a  x=5 AND y=10;.**
223b0 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20  .** Transformed 
223c0 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  into:.**.**    S
223d0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
223e0 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64  LECT a AS x, c-d
223f0 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48   AS y FROM t1 WH
22400 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d  ERE a=5 AND c-d=
22410 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45  10).**     WHERE
22420 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a   x=5 AND y=10;.*
22430 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73  *.** The hope is
22440 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
22450 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e  added to the inn
22460 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61  er query will ma
22470 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66  ke it more.** ef
22480 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44  ficient..**.** D
22490 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68  o not attempt th
224a0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
224b0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  if:.**.**   (1) 
224c0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
224d0 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  is an aggregate.
224e0 20 20 28 49 6e 20 74 68 61 74 20 63 61 73 65 2c    (In that case,
224f0 20 77 65 27 64 20 72 65 61 6c 6c 79 20 77 61 6e   we'd really wan
22500 74 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 63 6f  t.**       to co
22510 70 79 20 74 68 65 20 6f 75 74 65 72 20 57 48 45  py the outer WHE
22520 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE-clause terms 
22530 6f 6e 74 6f 20 74 68 65 20 48 41 56 49 4e 47 20  onto the HAVING 
22540 63 6c 61 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a  clause of the.**
22550 20 20 20 20 20 20 20 69 6e 6e 65 72 20 71 75 65         inner que
22560 72 79 2e 20 20 42 75 74 20 74 68 65 79 20 70 72  ry.  But they pr
22570 6f 62 61 62 6c 79 20 77 6f 6e 27 74 20 68 65 6c  obably won't hel
22580 70 20 74 68 65 72 65 20 73 6f 20 64 6f 20 6e 6f  p there so do no
22590 74 20 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a  t bother.).**.**
225a0 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72     (2) The inner
225b0 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 65   query is the re
225c0 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
225d0 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65  a common table e
225e0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
225f0 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72     (3) The inner
22600 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d   query has a LIM
22610 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65  IT clause (since
22620 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
22630 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20  the WHERE.**    
22640 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63     close would c
22650 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e  hange the meanin
22660 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e  g of the LIMIT).
22670 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65  .**.**   (4) The
22680 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
22690 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
226a0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
226b0 2e 20 20 28 54 68 65 20 63 61 6c 6c 65 72 0a 2a  .  (The caller.*
226c0 2a 20 20 20 20 20 20 20 65 6e 66 6f 72 63 65 73  *       enforces
226d0 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
226e0 6e 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  n since this rou
226f0 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68 61  tine does not ha
22700 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20 20  ve enough.**    
22710 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74     information t
22720 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20  o know.).**.**  
22730 20 28 35 29 20 54 68 65 20 57 48 45 52 45 20 63   (5) The WHERE c
22740 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e  lause expression
22750 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74   originates in t
22760 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
22770 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
22780 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a  f a LEFT JOIN..*
22790 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  *.** Return 0 if
227a0 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
227b0 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72  made and non-zer
227c0 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  o if one or more
227d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a   WHERE clause.**
227e0 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69   terms are dupli
227f0 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73  cated into the s
22800 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
22810 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57  ic int pushDownW
22820 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72  hereTerms(.  Par
22830 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
22840 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
22850 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28  ext (for malloc(
22860 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f  ) and error repo
22870 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65  rting) */.  Sele
22880 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20  ct *pSubq,      
22890 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
228a0 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c  y whose WHERE cl
228b0 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75  ause is to be au
228c0 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70  gmented */.  Exp
228d0 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
228e0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
228f0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
22900 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
22910 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20 20 20  nt iCursor      
22920 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
22930 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62  umber of the sub
22940 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78  query */.){.  Ex
22950 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
22960 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 53 65 6c  nChng = 0;.  Sel
22970 65 63 74 20 2a 70 58 3b 20 20 20 20 20 20 20 20  ect *pX;        
22980 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
22990 67 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20  g over compound 
229a0 53 45 4c 45 43 54 73 20 69 6e 20 70 53 75 62 71  SELECTs in pSubq
229b0 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
229c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
229d0 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20    for(pX=pSubq; 
229e0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  pX; pX=pX->pPrio
229f0 72 29 7b 0a 20 20 20 20 69 66 28 20 28 70 58 2d  r){.    if( (pX-
22a00 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
22a10 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52 65 63  Aggregate|SF_Rec
22a20 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b 0a 20  ursive))!=0 ){. 
22a30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
22a40 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  X->selFlags & SF
22a50 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
22a60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
22a70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22a80 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20 20  Recursive );.   
22a90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 21     testcase( pX!
22aa0 3d 70 53 75 62 71 20 29 3b 0a 20 20 20 20 20 20  =pSubq );.      
22ab0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
22ac0 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20 61 6e  trictions (1) an
22ad0 64 20 28 32 29 20 2a 2f 0a 20 20 20 20 7d 0a 20  d (2) */.    }. 
22ae0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e   }.  if( pSubq->
22af0 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20  pLimit!=0 ){.   
22b00 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
22b10 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f  striction (3) */
22b20 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57  .  }.  while( pW
22b30 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
22b40 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d   ){.    nChng +=
22b50 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
22b60 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
22b70 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68  q, pWhere->pRigh
22b80 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t, iCursor);.   
22b90 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65   pWhere = pWhere
22ba0 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69  ->pLeft;.  }.  i
22bb0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
22bc0 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f  ty(pWhere,EP_Fro
22bd0 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
22be0 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
22bf0 6e 20 35 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  n 5 */.  if( sql
22c00 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
22c10 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20  onstant(pWhere, 
22c20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  iCursor) ){.    
22c30 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69  nChng++;.    whi
22c40 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20  le( pSubq ){.   
22c50 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
22c60 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  x;.      pNew = 
22c70 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
22c80 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72  Parse->db, pWher
22c90 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 78 2e 70  e, 0);.      x.p
22ca0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
22cb0 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d        x.iTable =
22cc0 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20   iCursor;.      
22cd0 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43  x.iNewTable = iC
22ce0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69  ursor;.      x.i
22cf0 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20  sLeftJoin = 0;. 
22d00 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20       x.pEList = 
22d10 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20  pSubq->pEList;. 
22d20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73       pNew = subs
22d30 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b  tExpr(&x, pNew);
22d40 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57  .      pSubq->pW
22d50 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
22d60 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
22d70 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c  , pSubq->pWhere,
22d80 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 53   pNew);.      pS
22d90 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50 72  ubq = pSubq->pPr
22da0 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ior;.    }.  }. 
22db0 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d   return nChng;.}
22dc0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
22dd0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
22de0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
22df0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22e00 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a  T_VIEW) */../*.*
22e10 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63  * Based on the c
22e20 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41  ontents of the A
22e30 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
22e40 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
22e50 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
22e60 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ent, this functi
22e70 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  on checks if the
22e80 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
22e90 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  rue:.**.**    * 
22ea0 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69  the query contai
22eb0 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  ns just a single
22ec0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
22ed0 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65  ion,.**    * the
22ee0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
22ef0 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69  ion is either mi
22f00 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e  n() or max(), an
22f10 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72  d.**    * the ar
22f20 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67  gument to the ag
22f30 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
22f40 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
22f50 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c  ue..**.** If all
22f60 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
22f70 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45  e true, then WHE
22f80 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
22f90 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
22fa0 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MAX.** is return
22fb0 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ed as appropriat
22fc0 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d  e. Also, *ppMinM
22fd0 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ax is set to poi
22fe0 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69  nt to the .** li
22ff0 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  st of arguments 
23000 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61 67  passed to the ag
23010 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20 72  gregate before r
23020 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
23030 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69  Or, if the condi
23040 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20  tions above are 
23050 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d  not met, *ppMinM
23060 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ax is set to 0 a
23070 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45  nd.** WHERE_ORDE
23080 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65  RBY_NORMAL is re
23090 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
230a0 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79  c u8 minMaxQuery
230b0 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e  (AggInfo *pAggIn
230c0 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  fo, ExprList **p
230d0 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  pMinMax){.  int 
230e0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
230f0 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20  ERBY_NORMAL;    
23100 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
23110 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d  value */..  *ppM
23120 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28  inMax = 0;.  if(
23130 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
23140 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ==1 ){.    Expr 
23150 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66  *pExpr = pAggInf
23160 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70  o->aFunc[0].pExp
23170 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20  r; /* Aggregate 
23180 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
23190 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
231a0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
231b0 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  t;      /* Argum
231c0 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63  ents to agg func
231d0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73  tion */..    ass
231e0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
231f0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
23200 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  );.    if( pELis
23210 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
23220 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d  pr==1 && pEList-
23230 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  >a[0].pExpr->op=
23240 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
23250 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
23260 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70  ar *zFunc = pExp
23270 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
23280 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
23290 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69  rICmp(zFunc, "mi
232a0 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
232b0 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
232c0 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20  RDERBY_MIN;.    
232d0 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20      *ppMinMax = 
232e0 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65  pEList;.      }e
232f0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
23300 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
23310 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ax")==0 ){.     
23320 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
23330 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20  ORDERBY_MAX;.   
23340 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
23350 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
23360 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
23370 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d  sert( *ppMinMax=
23380 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78  =0 || (*ppMinMax
23390 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  )->nExpr==1 );. 
233a0 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a   return eRet;.}.
233b0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
233c0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
233d0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
233e0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
233f0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
23400 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
23410 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  gument is the as
23420 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
23430 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
23440 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
23450 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
23460 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
23470 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
23480 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
23490 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
234a0 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
234b0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
234c0 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
234d0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
234e0 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
234f0 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
23500 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
23510 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
23520 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
23530 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
23540 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
23550 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
23560 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
23570 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
23580 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
23590 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
235a0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
235b0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
235c0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
235d0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
235e0 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
235f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
23600 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
23610 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
23620 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
23630 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
23640 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
23650 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
23660 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
23670 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
23680 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
23690 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
236a0 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
236b0 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
236c0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
236d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
236e0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
236f0 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
23700 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
23710 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
23720 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
23730 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
23740 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
23750 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
23760 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
23770 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
23780 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
23790 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
237a0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
237b0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
237c0 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
237d0 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
237e0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
237f0 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
23800 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
23810 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
23820 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
23830 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
23840 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
23850 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
23860 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
23870 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
23880 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
23890 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
238a0 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
238b0 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
238c0 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
238d0 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
238e0 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
238f0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
23900 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
23910 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
23920 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
23930 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
23940 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
23950 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66  pTab && pFrom->f
23960 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b  g.isIndexedBy ){
23970 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
23980 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
23990 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
239a0 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31  edBy = pFrom->u1
239b0 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20  .zIndexedBy;.   
239c0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
239d0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
239e0 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20  >pIndex; .      
239f0 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65    pIdx && sqlite
23a00 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a  3StrICmp(pIdx->z
23a10 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79  Name, zIndexedBy
23a20 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
23a30 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
23a40 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
23a50 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
23a60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
23a70 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
23a80 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64  x: %s", zIndexed
23a90 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  By, 0);.      pP
23aa0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
23ab0 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
23ac0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
23ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
23ae0 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49  m->pIBIndex = pI
23af0 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
23b00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
23b10 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f  .** Detect compo
23b20 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
23b30 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61  ments that use a
23b40 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
23b50 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c  e with .** an al
23b60 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
23b70 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
23b80 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e  .**    SELECT ..
23b90 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
23ba0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
23bb0 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20   t2 ORDER BY .. 
23bc0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
23bd0 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72  * These are rewr
23be0 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75  itten as a subqu
23bf0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ery:.**.**    SE
23c00 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
23c10 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
23c20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
23c30 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20  . FROM t2).**   
23c40 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43    ORDER BY ... C
23c50 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
23c60 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
23c70 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
23c80 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75  y because the mu
23c90 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
23ca0 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62  () routine.** ab
23cb0 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74  ove that generat
23cc0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
23cd0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
23ce0 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
23cf0 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65  BY clause.** use
23d00 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  s a merge algori
23d10 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65  thm that require
23d20 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
23d30 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e  ting sequence on
23d40 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
23d50 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65  olumns as on the
23d60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
23d70 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a  .  See ticket.**
23d80 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
23d90 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
23da0 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a  6709574d2a.**.**
23db0 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
23dc0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65  tion is only nee
23dd0 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20  ded for EXCEPT, 
23de0 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55  INTERSECT, and U
23df0 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49  NION..** The UNI
23e00 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
23e10 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20  works fine with 
23e20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
23e30 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a  By() even when.*
23e40 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c  * there are COLL
23e50 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ATE terms in the
23e60 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74   ORDER BY..*/.st
23e70 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74  atic int convert
23e80 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
23e90 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20  Subquery(Walker 
23ea0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
23eb0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
23ec0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
23ed0 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73   Select *pX;.  s
23ee0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
23ef0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
23f00 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74  em *a;.  SrcList
23f10 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72   *pNewSrc;.  Par
23f20 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f  se *pParse;.  To
23f30 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66  ken dummy;..  if
23f40 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
23f50 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
23f60 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  inue;.  if( p->p
23f70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
23f80 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23f90 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58  ;.  for(pX=p; pX
23fa0 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   && (pX->op==TK_
23fb0 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  ALL || pX->op==T
23fc0 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58  K_SELECT); pX=pX
23fd0 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66  ->pPrior){}.  if
23fe0 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pX==0 ) return
23ff0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
24000 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79   a = p->pOrderBy
24010 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  ->a;.  for(i=p->
24020 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d  pOrderBy->nExpr-
24030 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
24040 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70     if( a[i].pExp
24050 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  r->flags & EP_Co
24060 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  llate ) break;. 
24070 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72   }.  if( i<0 ) r
24080 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
24090 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ue;..  /* If we 
240a0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
240b0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
240c0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
240d0 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
240e0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
240f0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
24100 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24110 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
24120 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
24130 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
24140 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
24150 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
24160 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  rt;.  memset(&du
24170 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  mmy, 0, sizeof(d
24180 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72  ummy));.  pNewSr
24190 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
241a0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
241b0 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64  (pParse,0,0,0,&d
241c0 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a  ummy,pNew,0,0);.
241d0 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30    if( pNewSrc==0
241e0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
241f0 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a  ort;.  *pNew = *
24200 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  p;.  p->pSrc = p
24210 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c  NewSrc;.  p->pEL
24220 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
24230 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
24240 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
24250 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49  pr(db, TK_ASTERI
24260 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70  SK, 0));.  p->op
24270 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
24280 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20  p->pWhere = 0;. 
24290 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
242a0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  = 0;.  pNew->pHa
242b0 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ving = 0;.  pNew
242c0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
242d0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
242e0 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  .  p->pNext = 0;
242f0 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b  .  p->pWith = 0;
24300 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
24310 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
24320 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
24330 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76  lFlags & SF_Conv
24340 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70  erted)==0 );.  p
24350 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
24360 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73  _Converted;.  as
24370 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69  sert( pNew->pPri
24380 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  or!=0 );.  pNew-
24390 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d  >pPrior->pNext =
243a0 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70   pNew;.  pNew->p
243b0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65  Limit = 0;.  pNe
243c0 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  w->pOffset = 0;.
243d0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
243e0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
243f0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
24400 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
24410 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74  term pFrom has t
24420 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
24430 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  tion.** argument
24440 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20  s.  If it does, 
24450 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
24460 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
24470 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
24480 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70  on-zero, since p
24490 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  From is not allo
244a0 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c  wed to be a tabl
244b0 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f  e-valued functio
244c0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
244d0 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
244e0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
244f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
24500 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
24510 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
24520 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73  TabFunc ){.    s
24530 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
24540 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20  Parse, "'%s' is 
24550 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c  not a function",
24560 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pFrom->zName);.
24570 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
24580 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
24590 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
245a0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
245b0 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
245c0 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
245d0 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
245e0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
245f0 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
24600 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
24610 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
24620 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
24630 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
24640 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
24650 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
24660 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
24670 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
24680 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
24690 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
246a0 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
246b0 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
246c0 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
246d0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
246e0 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
246f0 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
24700 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
24710 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
24720 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
24730 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
24740 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
24750 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
24760 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
24770 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
24780 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
24790 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
247a0 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54  nt innermost WIT
247b0 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
247c0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
247d0 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
247e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
247f0 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
24800 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
24810 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
24820 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
24830 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
24840 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
24850 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
24860 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
24870 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
24880 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
24890 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
248a0 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
248b0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
248c0 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
248d0 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
248e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
248f0 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
24900 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
24910 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
24920 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
24930 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
24940 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
24950 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
24960 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
24970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
24980 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24990 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
249a0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
249b0 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
249c0 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
249d0 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
249e0 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
249f0 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
24a00 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
24a10 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
24a20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
24a30 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
24a40 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
24a50 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
24a60 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
24a70 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
24a80 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
24a90 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
24aa0 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
24ab0 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
24ac0 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
24ad0 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
24ae0 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
24af0 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
24b00 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
24b10 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
24b20 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
24b30 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
24b40 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
24b50 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
24b60 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
24b70 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
24b80 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
24b90 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
24ba0 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
24bb0 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
24bc0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
24bd0 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
24be0 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28  t( bFree==0 || (
24bf0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30  pParse->pWith==0
24c00 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74   && pParse->pWit
24c10 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20  hToFree==0) );. 
24c20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
24c30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
24c40 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29  ->pWith!=pWith )
24c50 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  ;.    pWith->pOu
24c60 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
24c70 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
24c80 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
24c90 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
24ca0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
24cb0 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  ree = pWith;.  }
24cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
24cd0 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
24ce0 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
24cf0 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
24d00 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
24d10 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
24d20 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
24d30 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
24d40 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
24d50 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
24d60 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
24d70 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
24d80 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
24d90 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
24da0 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
24db0 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
24dc0 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
24dd0 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
24de0 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
24df0 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
24e00 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
24e10 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
24e20 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
24e30 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
24e40 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
24e50 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
24e60 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
24e70 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
24e80 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
24e90 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
24ea0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
24eb0 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
24ec0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
24ed0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
24ee0 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
24ef0 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
24f00 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
24f10 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
24f20 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
24f30 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
24f40 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
24f50 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
24f60 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
24f70 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
24f80 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
24f90 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
24fa0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
24fb0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
24fc0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
24fd0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
24fe0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
24ff0 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
25000 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
25010 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
25020 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
25030 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
25040 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
25050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25060 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
25070 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
25080 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
25090 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
250a0 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
250b0 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
250c0 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
250d0 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
250e0 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
250f0 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
25100 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
25110 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
25120 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25140 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
25150 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
25160 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
25170 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
25180 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
25190 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
251a0 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
251b0 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
251c0 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
251d0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
251e0 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
251f0 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
25200 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
25210 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68  s non-NULL at th
25220 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
25230 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61  his is an illega
25240 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  l.    ** recursi
25250 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ve reference to 
25260 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20  CTE pCte. Leave 
25270 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
25280 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  se and return.  
25290 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70    ** early. If p
252a0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
252b0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
252c0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
252d0 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20  ve reference..  
252e0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
252f0 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a  e, proceed.  */.
25300 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43      if( pCte->zC
25310 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  teErr ){.      s
25320 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
25330 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74  Parse, pCte->zCt
25340 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  eErr, pCte->zNam
25350 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
25360 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
25370 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e     }.    if( can
25380 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
25390 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72  arse, pFrom) ) r
253a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
253b0 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  OR;..    assert(
253c0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
253d0 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  );.    pFrom->pT
253e0 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
253f0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
25400 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
25410 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
25420 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
25430 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62  _Abort;.    pTab
25440 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
25450 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
25460 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
25470 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
25480 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
25490 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61  ey = -1;.    pTa
254a0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
254b0 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
254c0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
254d0 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
254e0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
254f0 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c  = TF_Ephemeral |
25500 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77   TF_NoVisibleRow
25510 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70  id;.    pFrom->p
25520 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
25530 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43  SelectDup(db, pC
25540 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
25550 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
25560 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
25570 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
25580 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
25590 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
255a0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
255b0 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
255c0 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f  ecursive CTE. */
255d0 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f  .    pSel = pFro
255e0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
255f0 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20  bMayRecursive = 
25600 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41  ( pSel->op==TK_A
25610 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d  LL || pSel->op==
25620 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
25630 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
25640 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
25650 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  ;.      SrcList 
25660 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSrc = pFrom->p
25670 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
25680 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
25690 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
256a0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
256b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
256c0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
256d0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
256e0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
256f0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
25700 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
25710 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
25720 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
25730 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74  Item->zName, pCt
25740 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20  e->zName).      
25750 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
25760 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70   pItem->pTab = p
25770 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
25780 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  Item->fg.isRecur
25790 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
257a0 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
257b0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
257c0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
257d0 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
257e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
257f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
25800 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
25810 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
25820 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
25830 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62    if( pTab->nTab
25840 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73  Ref>2 ){.      s
25850 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a  qlite3ErrorMsg(.
25860 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
25870 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65  , "multiple refe
25880 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73  rences to recurs
25890 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  ive table: %s", 
258a0 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pCte->zName.    
258b0 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
258c0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
258d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
258e0 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d  ( pTab->nTabRef=
258f0 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65  =1 || ((pSel->se
25900 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73  lFlags&SF_Recurs
25910 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 54  ive) && pTab->nT
25920 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20  abRef==2 ));..  
25930 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
25940 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65  = "circular refe
25950 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20  rence: %s";.    
25960 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61  pSavedWith = pPa
25970 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
25980 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
25990 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
259a0 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
259b0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50        Select *pP
259c0 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72  rior = pSel->pPr
259d0 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ior;.      asser
259e0 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68  t( pPrior->pWith
259f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 72  ==0 );.      pPr
25a00 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53 65  ior->pWith = pSe
25a10 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20 20  l->pWith;.      
25a20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
25a30 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f  t(pWalker, pPrio
25a40 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  r);.      pPrior
25a50 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 20  ->pWith = 0;.   
25a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
25a70 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
25a80 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
25a90 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
25aa0 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
25ab0 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d  ..    for(pLeft=
25ac0 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72  pSel; pLeft->pPr
25ad0 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74  ior; pLeft=pLeft
25ae0 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70  ->pPrior);.    p
25af0 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  EList = pLeft->p
25b00 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  EList;.    if( p
25b10 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20  Cte->pCols ){.  
25b20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
25b30 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  & pEList->nExpr!
25b40 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45  =pCte->pCols->nE
25b50 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
25b60 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
25b70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
25b80 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66   has %d values f
25b90 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a  or %d columns",.
25ba0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65              pCte
25bb0 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d  ->zName, pEList-
25bc0 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43  >nExpr, pCte->pC
25bd0 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ols->nExpr.     
25be0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50     );.        pP
25bf0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
25c00 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20  avedWith;.      
25c10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25c20 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
25c30 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43       pEList = pC
25c40 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d  te->pCols;.    }
25c50 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ..    sqlite3Col
25c60 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
25c70 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
25c80 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
25c90 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
25ca0 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
25cb0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
25cc0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sel->selFlags & 
25cd0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
25ce0 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
25cf0 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c  teErr = "multipl
25d00 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
25d10 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20  rences: %s";.   
25d20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25d30 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
25d40 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66  = "recursive ref
25d50 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71  erence in a subq
25d60 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20  uery: %s";.     
25d70 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
25d80 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
25d90 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
25da0 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45  .    pCte->zCteE
25db0 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  rr = 0;.    pPar
25dc0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76  se->pWith = pSav
25dd0 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72  edWith;.  }..  r
25de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25df0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
25e00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
25e10 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  TE./*.** If the 
25e20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73  SELECT passed as
25e30 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
25e40 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f  ment has an asso
25e50 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20  ciated WITH .** 
25e60 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66  clause, pop it f
25e70 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74  rom the stack st
25e80 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
25e90 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
25ea0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
25eb0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73  ction is used as
25ec0 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c   the xSelectCall
25ed0 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b  back2() callback
25ee0 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65   by.** sqlite3Se
25ef0 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65  lectExpand() whe
25f00 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45  n walking a SELE
25f10 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c  CT tree to resol
25f20 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  ve table.** name
25f30 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d  s and other FROM
25f40 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73   clause elements
25f50 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
25f60 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28  d selectPopWith(
25f70 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
25f80 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
25f90 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
25fa0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
25fb0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 57    if( pParse->pW
25fc0 69 74 68 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ith && p->pPrior
25fd0 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  ==0 ){.    With 
25fe0 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67  *pWith = findRig
25ff0 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
26000 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21  ;.    if( pWith!
26010 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
26020 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
26030 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
26040 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
26050 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  = pWith->pOuter;
26060 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
26070 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
26080 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
26090 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
260a0 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
260b0 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
260c0 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
260d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
260e0 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
260f0 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
26100 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
26110 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
26120 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
26130 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
26140 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
26150 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
26160 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
26170 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
26180 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
26190 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
261a0 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
261b0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
261c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
261d0 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
261e0 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
261f0 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
26200 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
26210 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
26220 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
26230 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
26240 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
26250 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
26260 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
26270 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
26280 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
26290 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
262a0 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
262b0 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
262c0 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
262d0 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
262e0 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
262f0 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
26300 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
26310 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74 65   up the persiste
26320 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
26330 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
26340 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
26350 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
26360 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
26370 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f  lause to accommo
26380 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
26390 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
263a0 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
263b0 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
263c0 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
263d0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
263e0 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
263f0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
26400 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
26410 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
26420 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
26430 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
26440 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
26450 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
26460 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
26470 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
26480 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
26490 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
264a0 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
264b0 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
264c0 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
264d0 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
264e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
264f0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61  electExpander(Wa
26500 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
26510 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
26520 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
26530 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
26540 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53  int i, j, k;.  S
26550 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
26560 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
26570 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
26580 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
26590 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
265a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
265b0 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69    Expr *pE, *pRi
265c0 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75  ght, *pExpr;.  u
265d0 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  16 selFlags = p-
265e0 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d  >selFlags;..  p-
265f0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
26600 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20  Expanded;.  if( 
26610 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26620 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
26630 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
26640 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53   if( NEVER(p->pS
26650 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c  rc==0) || (selFl
26660 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
26670 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
26680 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
26690 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
266a0 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
266b0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
266c0 20 69 66 28 20 70 2d 3e 70 57 69 74 68 20 29 7b   if( p->pWith ){
266d0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74 68  .    sqlite3With
266e0 50 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e  Push(pParse, p->
266f0 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a  pWith, 0);.  }..
26700 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
26710 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
26720 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
26730 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
26740 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
26750 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
26760 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
26770 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
26780 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
26790 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
267a0 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
267b0 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
267c0 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
267d0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
267e0 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
267f0 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
26800 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
26810 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
26820 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
26830 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
26840 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
26850 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
26860 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
26870 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
26880 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
26890 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
268a0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
268b0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
268c0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
268d0 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
268e0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
268f0 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f  rsive==0 || pFro
26900 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  m->pTab!=0 );.  
26910 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e    if( pFrom->fg.
26920 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f  isRecursive ) co
26930 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
26940 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
26950 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
26960 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
26970 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64    if( withExpand
26980 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29  (pWalker, pFrom)
26990 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
269a0 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72  ort;.    if( pFr
269b0 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c  om->pTab ) {} el
269c0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
269d0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
269e0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
269f0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
26a00 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
26a10 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
26a20 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
26a30 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
26a40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
26a50 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
26a60 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
26a70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
26a80 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
26a90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
26aa0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
26ab0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
26ac0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
26ad0 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46 72 6f  bort;.      pFro
26ae0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
26af0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
26b00 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
26b10 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69  Table));.      i
26b20 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
26b30 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26b40 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
26b50 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54  ef = 1;.      pT
26b60 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
26b70 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
26b80 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28  sqlite_sq_%p", (
26b90 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20  void*)pTab);.   
26ba0 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
26bb0 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d  pPrior ){ pSel =
26bc0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d   pSel->pPrior; }
26bd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
26be0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
26bf0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  t(pParse, pSel->
26c00 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43  pEList,&pTab->nC
26c10 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  ol,&pTab->aCol);
26c20 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  .      pTab->iPK
26c30 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  ey = -1;.      p
26c40 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
26c50 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
26c60 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
26c70 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
26c80 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
26c90 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
26ca0 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  al;.#endif.    }
26cb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
26cc0 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
26cd0 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
26ce0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
26cf0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
26d00 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
26d10 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
26d20 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
26d30 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
26d40 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
26d50 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69   pFrom);.      i
26d60 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
26d70 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26d80 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e       if( pTab->n
26d90 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20 29  TabRef>=0xffff )
26da0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26db0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
26dc0 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65  , "too many refe
26dd0 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22  rences to \"%s\"
26de0 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20  : max 65535",.  
26df0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
26e00 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
26e10 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  From->pTab = 0;.
26e20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
26e30 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
26e40 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54  }.      pTab->nT
26e50 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69  abRef++;.      i
26e60 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
26e70 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46  ab) && cannotBeF
26e80 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
26e90 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
26ea0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
26eb0 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  rt;.      }.#if 
26ec0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
26ed0 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
26ee0 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
26ef0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
26f00 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69  ).      if( IsVi
26f10 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70  rtual(pTab) || p
26f20 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
26f30 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c          i16 nCol
26f40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
26f50 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
26f60 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
26f70 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
26f80 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
26f90 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
26fa0 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
26fb0 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
26fc0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
26fd0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
26fe0 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
26ff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
27000 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72  electSetName(pFr
27010 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61  om->pSelect, pTa
27020 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
27030 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     nCol = pTab->
27040 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54  nCol;.        pT
27050 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  ab->nCol = -1;. 
27060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
27070 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
27080 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
27090 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  );.        pTab-
270a0 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
270b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
270c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74   }..    /* Locat
270d0 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  e the index name
270e0 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44  d by the INDEXED
270f0 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61   BY clause, if a
27100 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ny. */.    if( s
27110 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
27120 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46  ookup(pParse, pF
27130 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65  rom) ){.      re
27140 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
27150 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
27160 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
27170 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
27180 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
27190 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
271a0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
271b0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69  ocFailed || sqli
271c0 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
271d0 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
271e0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
271f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
27200 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
27210 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
27220 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
27230 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
27240 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
27250 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
27260 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
27270 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
27280 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
27290 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
272a0 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
272b0 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
272c0 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
272d0 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
272e0 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72  STERISK operator
272f0 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
27300 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
27310 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c  he column.  ** l
27320 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ist.  The follow
27330 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
27340 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
27350 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a  TK_ASTERISK.  **
27360 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
27370 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65   expand each one
27380 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
27390 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20  all columns in. 
273a0 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   ** all tables..
273b0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
273c0 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
273d0 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
273e0 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
273f0 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
27400 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
27410 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
27420 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
27430 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
27440 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
27450 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
27460 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45   pE->op==TK_ASTE
27470 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  RISK ) break;.  
27480 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
27490 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
274a0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
274b0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
274c0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
274d0 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
274e0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
274f0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
27500 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
27510 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
27520 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
27530 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  ak;.  }.  if( k<
27540 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
27550 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
27560 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
27570 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
27580 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
27590 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
275a0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
275b0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
275c0 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
275d0 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
275e0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
275f0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
27600 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
27610 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
27620 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
27630 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
27640 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
27650 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
27660 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
27670 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
27680 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
27690 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
276a0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
276b0 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
276c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276d0 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
276e0 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
276f0 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f  mes)==0;..    fo
27700 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
27710 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
27720 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
27730 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68  xpr;.      pRigh
27740 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a  t = pE->pRight;.
27750 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
27760 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
27770 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
27780 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
27790 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20  K_ASTERISK.     
277a0 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b    && (pE->op!=TK
277b0 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e  _DOT || pRight->
277c0 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29  op!=TK_ASTERISK)
277d0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
277e0 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
277f0 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
27800 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
27810 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
27820 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27830 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
27840 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
27850 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
27860 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
27870 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
27880 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
27890 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
278a0 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
278b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
278c0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
278d0 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e  1].zSpan = a[k].
278e0 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20  zSpan;.         
278f0 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
27900 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
27910 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20  zSpan = 0;.     
27920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b     }.        a[k
27930 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
27940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27950 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
27960 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
27970 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
27980 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
27990 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
279a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
279b0 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
279c0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
279d0 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
279e0 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
279f0 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b  har *zTName = 0;
27a00 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
27a10 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
27a20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
27a30 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  E->op==TK_DOT ){
27a40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
27a50 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  t( pE->pLeft!=0 
27a60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
27a70 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
27a80 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c  perty(pE->pLeft,
27a90 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
27aa0 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
27ab0 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75  e = pE->pLeft->u
27ac0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
27ad0 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
27ae0 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
27af0 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
27b00 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
27b10 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
27b20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
27b30 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
27b40 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
27b50 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sub = pFrom->pSe
27b60 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20  lect;.          
27b70 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
27b80 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
27b90 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
27ba0 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d  char *zSchemaNam
27bb0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
27bc0 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
27bd0 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
27be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
27bf0 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
27c00 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
27c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27c20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
27c30 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
27c40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
27c50 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73  b==0 || (pSub->s
27c60 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
27c70 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20  tedFrom)==0 ){. 
27c80 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20             pSub 
27c90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
27ca0 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73   if( zTName && s
27cb0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
27cc0 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
27cd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27ce0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
27cf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27d00 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71          iDb = sq
27d10 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
27d20 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
27d30 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
27d40 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d     zSchemaName =
27d50 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44   iDb>=0 ? db->aD
27d60 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20  b[iDb].zDbSName 
27d70 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20  : "*";.         
27d80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72   }.          for
27d90 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
27da0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
27db0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
27dc0 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
27dd0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
27de0 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e       char *zColn
27df0 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ame;  /* The com
27e00 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
27e10 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
27e20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20   char *zToFree; 
27e30 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74    /* Malloced st
27e40 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20  ring that needs 
27e50 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
27e60 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e             Token
27e70 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43   sColname;  /* C
27e80 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
27e90 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a  ame as a token *
27ea0 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  /..            a
27eb0 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a  ssert( zName );.
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27ed0 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20  zTName && pSub. 
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
27ef0 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e  qlite3MatchSpanN
27f00 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74  ame(pSub->pEList
27f10 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c  ->a[j].zSpan, 0,
27f20 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20   zTName, 0)==0. 
27f30 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
27f40 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
27f50 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
27f60 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
27f70 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
27f80 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
27f90 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66  dden', omit it f
27fa0 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64  rom the expanded
27fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
27fc0 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20  result-set list 
27fd0 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43  unless the SELEC
27fe0 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63  T has the SF_Inc
27ff0 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20  ludeHidden.     
28000 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65         ** bit se
28010 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
28020 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
28030 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
28040 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65   SF_IncludeHidde
28050 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
28060 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f     && IsHiddenCo
28070 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
28080 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20  [j]) .          
28090 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
280a0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
280b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
280c0 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
280d0 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
280e0 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54     if( i>0 && zT
280f0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
28100 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46           if( (pF
28110 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  rom->fg.jointype
28120 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
28130 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
28140 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c    && tableAndCol
28150 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
28160 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  t, i, zName, 0, 
28170 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
28180 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28190 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
281a0 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
281b0 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
281c0 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
281d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
281e0 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  le to the right 
281f0 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
28210 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
28220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28230 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
28240 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46  e3IdListIndex(pF
28250 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  rom->pUsing, zNa
28260 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
28270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
28280 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
28290 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
282a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282c0 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
282d0 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
282e0 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28300 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
28310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28330 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
28340 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
28350 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
28360 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
28370 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
28380 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
28390 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
283a0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
283b0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
283c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
283d0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
283f0 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
28400 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
28410 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
28420 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
28430 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
28440 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
28450 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
28460 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
28470 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  emaName ){.     
28480 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
28490 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
284a0 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d  b, TK_ID, zSchem
284b0 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  aName);.        
284c0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
284d0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
284e0 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
284f0 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ft, pExpr);.    
28500 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28510 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
28520 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
28530 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
28540 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
28550 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
28560 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
28570 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28580 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43      zToFree = zC
28590 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
285a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
285b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
285c0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
285d0 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
285e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
285f0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
28600 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
28610 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
28620 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
28630 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e    sqlite3TokenIn
28640 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43  it(&sColname, zC
28650 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
28660 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28670 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
28680 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e  se, pNew, &sColn
28690 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
286a0 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
286b0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
286c0 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d  SF_NestedFrom)!=
286d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
286e0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
286f0 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70  st_item *pX = &p
28700 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
28710 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  pr-1];.         
28720 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b       if( pSub ){
28730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28740 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
28750 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
28760 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61   pSub->pEList->a
28770 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [j].zSpan);.    
28780 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
28790 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
287a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
287b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
287c0 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
287d0 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50  Span = sqlite3MP
287e0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
287f0 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .%s",.          
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54   zSchemaName, zT
28830 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  abName, zColname
28840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
28850 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
28860 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
28870 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28880 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62             pX->b
28890 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20  SpanIsTab = 1;. 
288a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
288b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
288c0 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72  DbFree(db, zToFr
288d0 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
288e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
288f0 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65     if( !tableSee
28900 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
28910 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20  f( zTName ){.   
28920 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28930 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
28940 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
28950 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20   %s", zTName);. 
28960 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
28970 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28980 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28990 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73  se, "no tables s
289a0 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
289b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
289c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
289d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
289e0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45  istDelete(db, pE
289f0 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
28a00 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
28a10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
28a20 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
28a30 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c  pEList && p->pEL
28a40 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  ist->nExpr>db->a
28a50 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
28a60 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
28a70 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
28a80 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
28a90 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
28aa0 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20  esult set");.   
28ab0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
28ac0 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  t;.  }.#endif.  
28ad0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
28ae0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
28af0 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
28b00 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
28b10 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
28b20 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
28b30 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
28b40 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
28b50 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
28b60 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
28b70 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
28b80 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
28b90 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
28ba0 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
28bb0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
28bc0 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
28bd0 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
28be0 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
28bf0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
28c00 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
28c10 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
28c20 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
28c30 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
28c40 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
28c50 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
28c60 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
28c70 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
28c80 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
28c90 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
28ca0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
28cb0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
28cc0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
28cd0 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
28ce0 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
28cf0 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45 43 54  alker for SELECT
28d00 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20   statements..** 
28d10 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
28d20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
28d30 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
28d40 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  tWalkNoop(Walker
28d50 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63   *NotUsed, Selec
28d60 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  t *NotUsed2){.  
28d70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28d80 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
28d90 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ed2);.  return W
28da0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
28db0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
28dc0 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73  ./*.** Always as
28dd0 73 65 72 74 2e 20 20 54 68 69 73 20 78 53 65 6c  sert.  This xSel
28de0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70  ectCallback2 imp
28df0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76  lementation prov
28e00 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 78  es that the.** x
28e10 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
28e20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64  is never invoked
28e30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
28e40 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72  3SelectWalkAsser
28e50 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  t2(Walker *NotUs
28e60 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  ed, Select *NotU
28e70 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
28e80 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
28e90 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
28ea0 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a   assert( 0 );.}.
28eb0 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69  #endif./*.** Thi
28ec0 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
28ed0 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
28ee0 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
28ef0 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
28f00 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
28f10 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
28f20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
28f30 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
28f40 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
28f50 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
28f60 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
28f70 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
28f80 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
28f90 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
28fa0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28fb0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
28fc0 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
28fd0 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
28fe0 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
28ff0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
29000 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
29010 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
29020 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
29030 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
29040 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
29050 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
29060 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
29070 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
29080 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
29090 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
290a0 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
290b0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
290c0 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
290d0 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
290e0 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
290f0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
29100 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
29110 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
29120 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
29130 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
29140 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
29150 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
29160 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
29170 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
29180 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70   pParse->hasComp
29190 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53  ound ){.    w.xS
291a0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
291b0 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
291c0 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b  electToSubquery;
291d0 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
291e0 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20  llback2 = 0;.   
291f0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
29200 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
29210 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74  .  }.  w.xSelect
29220 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
29230 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78  tExpander;.  w.x
29240 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
29250 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b  = selectPopWith;
29260 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
29270 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
29280 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
29290 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
292a0 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ERY./*.** This i
292b0 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  s a Walker.xSele
292c0 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62  ctCallback callb
292d0 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
292e0 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66  te3SelectTypeInf
292f0 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  o().** interface
29300 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
29310 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
29320 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d  query, add Colum
29330 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75  n.zType and Colu
29340 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f  mn.zColl.** info
29350 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54  rmation to the T
29360 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
29370 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
29380 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  he result set.**
29390 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72   of that subquer
293a0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62  y..**.** The Tab
293b0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
293c0 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
293d0 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20   result set was 
293e0 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62  constructed.** b
293f0 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  y selectExpander
29400 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20  () but the type 
29410 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
29420 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d  formation was om
29430 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74  itted.** at that
29440 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69   point because i
29450 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e  dentifiers had n
29460 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f  ot yet been reso
29470 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  lved.  This.** r
29480 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
29490 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65   after identifie
294a0 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  r resolution..*/
294b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
294c0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
294d0 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
294e0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
294f0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
29500 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
29510 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
29520 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
29530 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
29540 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
29550 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
29560 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73 73 65 72  olved );.  asser
29570 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
29580 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
29590 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c  )==0 );.  p->sel
295a0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54  Flags |= SF_HasT
295b0 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  ypeInfo;.  pPars
295c0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
295d0 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  rse;.  pTabList 
295e0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72  = p->pSrc;.  for
295f0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
29600 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
29610 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
29620 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
29630 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
29640 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
29650 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
29660 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
29670 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
29680 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
29690 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
296a0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
296b0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
296c0 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  T */.      Selec
296d0 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
296e0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
296f0 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
29700 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
29710 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d  >pPrior ) pSel =
29720 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSel->pPrior;. 
29730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
29740 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
29750 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
29760 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
29770 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29780 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
29790 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
297a0 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
297b0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
297c0 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
297d0 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
297e0 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
297f0 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
29800 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
29810 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
29820 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
29830 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
29840 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
29850 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
29860 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
29870 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
29880 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
29890 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
298a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
298b0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
298c0 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65  ker w;.  w.xSele
298d0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ctCallback = sql
298e0 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
298f0 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  op;.  w.xSelectC
29900 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
29910 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
29920 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43  Info;.  w.xExprC
29930 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
29940 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
29950 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
29960 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
29970 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
29980 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
29990 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
299a0 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
299b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
299c0 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
299d0 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
299e0 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
299f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
29a00 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
29a10 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
29a20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
29a30 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
29a40 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
29a50 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
29a60 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
29a70 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
29a80 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
29a90 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
29aa0 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
29ab0 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
29ac0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
29ad0 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
29ae0 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
29af0 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
29b00 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
29b10 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
29b20 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
29b30 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
29b40 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
29b50 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
29b60 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
29b70 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
29b80 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
29b90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
29ba0 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
29bb0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
29bc0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
29bd0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
29be0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
29bf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
29c00 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
29c10 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
29c20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
29c30 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
29c40 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
29c50 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
29c60 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
29c70 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
29c80 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
29c90 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
29ca0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29cb0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
29cc0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
29cd0 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
29ce0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
29cf0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
29d00 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
29d10 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
29d20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29d30 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
29d40 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
29d50 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
29d60 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
29d70 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
29d80 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
29d90 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
29da0 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
29db0 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
29dc0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
29dd0 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
29de0 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
29df0 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
29e00 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
29e10 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
29e20 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
29e30 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
29e40 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
29e50 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
29e60 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
29e70 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
29e80 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74  tes code that st
29e90 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
29ea0 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
29eb0 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  y.** cells..*/.s
29ec0 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
29ed0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
29ee0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
29ef0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
29f00 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
29f10 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
29f20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
29f30 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
29f40 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41  .  int nReg = pA
29f50 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20  ggInfo->nFunc + 
29f60 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
29f70 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30  n;.  if( nReg==0
29f80 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65   ) return;.#ifde
29f90 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
29fa0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
29fb0 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69  all AggInfo regi
29fc0 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e  sters are within
29fd0 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69   the range speci
29fe0 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67  fied by.  ** Agg
29ff0 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49  Info.mnReg..AggI
2a000 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61  nfo.mxReg */.  a
2a010 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67  ssert( nReg==pAg
2a020 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67  gInfo->mxReg-pAg
2a030 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29  gInfo->mnReg+1 )
2a040 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2a050 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2a060 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
2a070 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  rt( pAggInfo->aC
2a080 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  ol[i].iMem>=pAgg
2a090 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
2a0a0 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
2a0b0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d  ->aCol[i].iMem<=
2a0c0 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
2a0d0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
2a0e0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2a0f0 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  unc; i++){.    a
2a100 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
2a110 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d  >aFunc[i].iMem>=
2a120 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
2a130 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2a140 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
2a150 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
2a160 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  xReg );.  }.#end
2a170 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  if.  sqlite3Vdbe
2a180 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
2a190 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
2a1a0 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d  mnReg, pAggInfo-
2a1b0 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70  >mxReg);.  for(p
2a1c0 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
2a1d0 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
2a1e0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2a1f0 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
2a200 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
2a210 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
2a220 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
2a230 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
2a240 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2a250 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
2a260 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2a270 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
2a280 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
2a290 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
2a2a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2a2b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2a2c0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
2a2d0 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
2a2e0 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
2a2f0 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
2a300 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
2a310 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
2a320 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
2a330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
2a340 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
2a350 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
2a360 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
2a370 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  >x.pList, 0, 0);
2a380 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a390 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2a3a0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
2a3b0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2a3c0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3e0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
2a3f0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2a400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a410 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
2a420 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
2a430 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
2a440 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
2a450 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
2a460 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
2a470 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
2a480 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
2a490 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
2a4a0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
2a4b0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2a4c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2a4d0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2a4e0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2a4f0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
2a500 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
2a510 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
2a520 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2a530 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
2a540 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
2a550 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
2a560 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2a570 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2a580 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
2a590 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2a5a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a5b0 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
2a5c0 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
2a5d0 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
2a5e0 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  r : 0);.    sqli
2a5f0 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
2a600 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  v, pF->pFunc, P4
2a610 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
2a620 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
2a630 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
2a640 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
2a650 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
2a660 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
2a670 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
2a680 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2a690 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
2a6a0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
2a6b0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
2a6c0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2a6d0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2a6e0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2a6f0 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
2a700 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
2a710 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
2a720 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2a730 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2a740 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
2a750 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2a760 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
2a770 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
2a780 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
2a790 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2a7a0 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
2a7b0 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
2a7c0 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
2a7d0 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
2a7e0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
2a7f0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
2a800 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
2a810 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2a820 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
2a830 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2a840 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
2a850 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
2a860 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
2a870 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
2a880 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
2a890 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
2a8a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2a8b0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2a8c0 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
2a8d0 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   0, SQLITE_ECEL_
2a8e0 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DUP);.    }else{
2a8f0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
2a900 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
2a910 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2a920 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
2a930 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
2a940 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
2a950 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2a960 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2a970 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72  Arg==0 );  /* Er
2a980 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f  ror condition */
2a990 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2a9a0 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20   nArg>1 );   /* 
2a9b0 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f  Also an error */
2a9c0 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
2a9d0 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
2a9e0 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
2a9f0 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
2aa00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2aa10 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  F->pFunc->funcFl
2aa20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
2aa30 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
2aa40 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
2aa50 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
2aa60 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2aa70 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
2aa80 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
2aa90 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
2aaa0 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
2aab0 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
2aac0 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
2aad0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
2aae0 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
2aaf0 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
2ab00 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2ab10 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2ab20 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2ab30 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
2ab40 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
2ab50 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2ab60 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
2ab70 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
2ab80 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
2ab90 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69  .      if( regHi
2aba0 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f  t==0 && pAggInfo
2abb0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29  ->nAccumulator )
2abc0 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72   regHit = ++pPar
2abd0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2abe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2abf0 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
2ac00 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28   regHit, 0, 0, (
2ac10 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
2ac20 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
2ac30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ac40 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67  AddOp3(v, OP_Agg
2ac50 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67 67  Step0, 0, regAgg
2ac60 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20  , pF->iMem);.   
2ac70 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
2ac80 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e  ndP4(v, pF->pFun
2ac90 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
2aca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2acb0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
2acc0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
2acd0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
2ace0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
2acf0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
2ad00 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2ad10 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
2ad20 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
2ad30 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
2ad40 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
2ad50 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2ad60 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
2ad70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ad80 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2ad90 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
2ada0 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70  }..  /* Before p
2adb0 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63  opulating the ac
2adc0 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
2add0 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ers, clear the c
2ade0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
2adf0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
2ae00 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69  any of the requi
2ae10 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  red column value
2ae20 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72  s are already pr
2ae30 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72  esent .  ** in r
2ae40 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65  egisters, sqlite
2ae50 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20  3ExprCode() may 
2ae60 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  use OP_SCopy to 
2ae70 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20  copy the value. 
2ae80 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e   ** to pC->iMem.
2ae90 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65   But by the time
2aea0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73   the value is us
2aeb0 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
2aec0 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d   register.  ** m
2aed0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65  ay have been use
2aee0 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  d, invalidating 
2aef0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
2af00 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  uffer holding th
2af10 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62  e.  ** text or b
2af20 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74  lob value. See t
2af30 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62  icket [883034dcb
2af40 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  5]..  **.  ** An
2af50 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77  other solution w
2af60 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67  ould be to chang
2af70 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75  e the OP_SCopy u
2af80 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68  sed to copy cach
2af90 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74  ed.  ** values t
2afa0 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20  o an OP_Copy..  
2afb0 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20  */.  if( regHit 
2afc0 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
2afd0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
2afe0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
2aff0 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f   regHit); VdbeCo
2b000 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
2b010 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2b020 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2b030 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
2b040 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
2b050 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
2b060 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
2b070 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
2b080 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2b090 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
2b0a0 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
2b0b0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
2b0c0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
2b0d0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2b0e0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64  arse);.  if( add
2b0f0 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20  rHitTest ){.    
2b100 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2b110 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65  ere(v, addrHitTe
2b120 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
2b130 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f  * Add a single O
2b140 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
2b150 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42  ction to the VDB
2b160 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73  E to explain a s
2b170 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a  imple.** count(*
2b180 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54  ) query ("SELECT
2b190 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
2b1a0 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  Tab")..*/.#ifnde
2b1b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2b1c0 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69  PLAIN.static voi
2b1d0 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  d explainSimpleC
2b1e0 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  ount(.  Parse *p
2b1f0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
2b200 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
2b210 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
2b220 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
2b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b240 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
2b250 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ried */.  Index 
2b260 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
2b270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2b280 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  ex used to optim
2b290 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c  ize scan, or NUL
2b2a0 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  L */.){.  if( pP
2b2b0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
2b2c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76   ){.    int bCov
2b2d0 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26  er = (pIdx!=0 &&
2b2e0 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
2b2f0 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65   || !IsPrimaryKe
2b300 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a  yIndex(pIdx)));.
2b310 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
2b320 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
2b330 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
2b340 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c  N TABLE %s%s%s",
2b350 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
2b360 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43  Name,.        bC
2b370 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43  over ? " USING C
2b380 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20  OVERING INDEX " 
2b390 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43  : "",.        bC
2b3a0 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61  over ? pIdx->zNa
2b3b0 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20  me : "".    );. 
2b3c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b3d0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70 50  dOp4(.        pP
2b3e0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
2b3f0 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
2b400 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
2b410 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d  , zEqp, P4_DYNAM
2b420 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  IC.    );.  }.}.
2b430 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
2b440 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2b450 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  t(a,b,c).#endif.
2b460 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f  ./*.** Context o
2b470 62 6a 65 63 74 20 66 6f 72 20 68 61 76 69 6e 67  bject for having
2b480 54 6f 57 68 65 72 65 45 78 70 72 43 62 28 29 2e  ToWhereExprCb().
2b490 0a 2a 2f 0a 73 74 72 75 63 74 20 48 61 76 69 6e  .*/.struct Havin
2b4a0 67 54 6f 57 68 65 72 65 43 74 78 20 7b 0a 20 20  gToWhereCtx {.  
2b4b0 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 3b 0a  Expr **ppWhere;.
2b4c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
2b4d0 75 70 42 79 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  upBy;.};../*.** 
2b4e0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2b4f0 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  ) callback used 
2b500 62 79 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  by havingToWhere
2b510 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
2b520 20 6e 6f 64 65 20 70 61 73 73 65 64 20 74 6f 20   node passed to 
2b530 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  the callback is 
2b540 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72  a TK_AND node, r
2b550 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f  eturn .** WRC_Co
2b560 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73  ntinue to tell s
2b570 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
2b580 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2b590 75 67 68 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e  ugh child nodes.
2b5a0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
2b5b0 2c 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75  , return WRC_Pru
2b5c0 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ne. In this case
2b5d0 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20 69 66 20  , also check if 
2b5e0 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72  the .** sub-expr
2b5f0 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74  ession matches t
2b600 68 65 20 63 72 69 74 65 72 69 61 20 66 6f 72 20  he criteria for 
2b610 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74  being moved to t
2b620 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75  he WHERE.** clau
2b630 73 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20 69  se. If so, add i
2b640 74 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  t to the WHERE c
2b650 6c 61 75 73 65 20 61 6e 64 20 72 65 70 6c 61 63  lause and replac
2b660 65 20 74 68 65 20 73 75 62 2d 65 78 70 72 65 73  e the sub-expres
2b670 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74  sion.** within t
2b680 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73  he HAVING expres
2b690 73 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 73  sion with a cons
2b6a0 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61  tant "1"..*/.sta
2b6b0 74 69 63 20 69 6e 74 20 68 61 76 69 6e 67 54 6f  tic int havingTo
2b6c0 57 68 65 72 65 45 78 70 72 43 62 28 57 61 6c 6b  WhereExprCb(Walk
2b6d0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2b6e0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
2b6f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
2b700 4e 44 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ND ){.    struct
2b710 20 48 61 76 69 6e 67 54 6f 57 68 65 72 65 43 74   HavingToWhereCt
2b720 78 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  x *p = pWalker->
2b730 75 2e 70 48 61 76 69 6e 67 43 74 78 3b 0a 20 20  u.pHavingCtx;.  
2b740 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2b750 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
2b760 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50  upBy(pWalker->pP
2b770 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 2d 3e  arse, pExpr, p->
2b780 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20 20  pGroupBy) ){.   
2b790 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
2b7a0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2b7b0 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78 70 72  ->db;.      Expr
2b7c0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
2b7d0 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
2b7e0 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
2b7f0 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20  e3IntTokens[1], 
2b800 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
2b810 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  ew ){.        Ex
2b820 70 72 20 2a 70 57 68 65 72 65 20 3d 20 2a 28 70  pr *pWhere = *(p
2b830 2d 3e 70 70 57 68 65 72 65 29 3b 0a 20 20 20 20  ->ppWhere);.    
2b840 20 20 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a      SWAP(Expr, *
2b850 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20  pNew, *pExpr);. 
2b860 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
2b870 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
2b880 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a   pWhere, pNew);.
2b890 20 20 20 20 20 20 20 20 2a 28 70 2d 3e 70 70 57          *(p->ppW
2b8a0 68 65 72 65 29 20 3d 20 70 4e 65 77 3b 0a 20 20  here) = pNew;.  
2b8b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b8c0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2b8d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
2b8e0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2b8f0 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
2b900 6c 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72  ligible terms fr
2b910 6f 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  om the HAVING cl
2b920 61 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c  ause of a query,
2b930 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f   which is.** pro
2b940 63 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f  cessed after gro
2b950 75 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48  uping, to the WH
2b960 45 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63  ERE clause, whic
2b970 68 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62  h is processed b
2b980 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e  efore.** groupin
2b990 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  g. For example, 
2b9a0 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
2b9b0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2b9c0 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20   <tables> WHERE 
2b9d0 61 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48  a=? GROUP BY b H
2b9e0 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d  AVING b=? AND c=
2b9f0 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ?.**.** can be r
2ba00 65 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a  ewritten as:.**.
2ba10 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2ba20 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52  OM <tables> WHER
2ba30 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52  E a=? AND b=? GR
2ba40 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
2ba50 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d  c=?.**.** A term
2ba60 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65   of the HAVING e
2ba70 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69  xpression is eli
2ba80 67 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66  gible for transf
2ba90 65 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74  er if it consist
2baa0 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66  s.** entirely of
2bab0 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65   constants and e
2bac0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
2bad0 61 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42  are also GROUP B
2bae0 59 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20  Y terms that.** 
2baf0 75 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22  use the "BINARY"
2bb00 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
2bb10 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nce..*/.static v
2bb20 6f 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72  oid havingToWher
2bb30 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
2bb40 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
2bb50 70 47 72 6f 75 70 42 79 2c 0a 20 20 45 78 70 72  pGroupBy,.  Expr
2bb60 20 2a 70 48 61 76 69 6e 67 2c 20 0a 20 20 45 78   *pHaving, .  Ex
2bb70 70 72 20 2a 2a 70 70 57 68 65 72 65 0a 29 7b 0a  pr **ppWhere.){.
2bb80 20 20 73 74 72 75 63 74 20 48 61 76 69 6e 67 54    struct HavingT
2bb90 6f 57 68 65 72 65 43 74 78 20 73 43 74 78 3b 0a  oWhereCtx sCtx;.
2bba0 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72    Walker sWalker
2bbb0 3b 0a 0a 20 20 73 43 74 78 2e 70 70 57 68 65 72  ;..  sCtx.ppWher
2bbc0 65 20 3d 20 70 70 57 68 65 72 65 3b 0a 20 20 73  e = ppWhere;.  s
2bbd0 43 74 78 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  Ctx.pGroupBy = p
2bbe0 47 72 6f 75 70 42 79 3b 0a 0a 20 20 6d 65 6d 73  GroupBy;..  mems
2bbf0 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20  et(&sWalker, 0, 
2bc00 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29  sizeof(sWalker))
2bc10 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72  ;.  sWalker.pPar
2bc20 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
2bc30 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
2bc40 62 61 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57  back = havingToW
2bc50 68 65 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57  hereExprCb;.  sW
2bc60 61 6c 6b 65 72 2e 75 2e 70 48 61 76 69 6e 67 43  alker.u.pHavingC
2bc70 74 78 20 3d 20 26 73 43 74 78 3b 0a 20 20 73 71  tx = &sCtx;.  sq
2bc80 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73  lite3WalkExpr(&s
2bc90 57 61 6c 6b 65 72 2c 20 70 48 61 76 69 6e 67 29  Walker, pHaving)
2bca0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2bcb0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70   to see if the p
2bcc0 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54  This entry of pT
2bcd0 61 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66  abList is a self
2bce0 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72  -join of a prior
2bcf0 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20   view..** If it 
2bd00 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  is, then return 
2bd10 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  the SrcList_item
2bd20 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76   for the prior v
2bd30 69 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e  iew.  If it is n
2bd40 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ot,.** then retu
2bd50 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
2bd60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2bd70 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56  tem *isSelfJoinV
2bd80 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  iew(.  SrcList *
2bd90 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
2bda0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
2bdb0 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20  r self-joins in 
2bdc0 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  this FROM clause
2bdd0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
2bde0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73  List_item *pThis
2bdf0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2be00 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65   prior reference
2be10 20 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72   to this subquer
2be20 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  y */.){.  struct
2be30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2be40 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65  Item;.  for(pIte
2be50 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b  m = pTabList->a;
2be60 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49   pItem<pThis; pI
2be70 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
2be80 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
2be90 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2bea0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
2beb0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63  viaCoroutine ) c
2bec0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2bed0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
2bee0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2bef0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2bf00 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74  icmp(pItem->zDat
2bf10 61 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44  abase, pThis->zD
2bf20 61 74 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f  atabase)!=0 ) co
2bf30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2bf40 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2bf50 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54  pItem->zName, pT
2bf60 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  his->zName)!=0 )
2bf70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2bf80 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2bf90 6d 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20  mpare(0, .      
2bfa0 20 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65      pThis->pSele
2bfb0 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65  ct->pWhere, pIte
2bfc0 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65  m->pSelect->pWhe
2bfd0 72 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a  re, -1) .    ){.
2bfe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65        /* The vie
2bff0 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62  w was modified b
2c000 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74  y some other opt
2c010 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61  imization such a
2c020 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44  s.      ** pushD
2c030 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20  ownWhereTerms() 
2c040 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
2c050 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
2c060 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20  urn pItem;.  }. 
2c070 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
2c080 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e  fdef SQLITE_COUN
2c090 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
2c0a0 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  TION./*.** Attem
2c0b0 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  pt to transform 
2c0c0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
2c0d0 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  orm.**.**    SEL
2c0e0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2c0f0 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
2c100 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
2c110 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a  LECT y FROM t2).
2c120 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a  **.** Into this:
2c130 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2c140 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
2c150 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45  ) FROM t1)+(SELE
2c160 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2c170 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74   t2).**.** The t
2c180 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  ransformation on
2c190 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20  ly works if all 
2c1a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2c1b0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
2c1c0 20 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65     *  The subque
2c1d0 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  ry is a UNION AL
2c1e0 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  L of two or more
2c1f0 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54   terms.**   *  T
2c200 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45  here is no WHERE
2c210 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20   or GROUP BY or 
2c220 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f  HAVING clauses o
2c230 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
2c240 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74  .**   *  The out
2c250 65 72 20 71 75 65 72 79 20 69 73 20 61 20 73 69  er query is a si
2c260 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a  mple count(*).**
2c270 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2c280 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
2c290 69 6f 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65  ion is undertake
2c2a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2c2b0 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69   countOfViewOpti
2c2c0 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  mization(Parse *
2c2d0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2c2e0 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  p){.  Select *pS
2c2f0 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45  ub, *pPrior;.  E
2c300 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78  xpr *pExpr;.  Ex
2c310 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71  pr *pCount;.  sq
2c320 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
2c330 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2c340 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30  SF_Aggregate)==0
2c350 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f   ) return 0;   /
2c360 2a 20 54 68 69 73 20 69 73 20 61 6e 20 61 67 67  * This is an agg
2c370 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
2c380 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
2c390 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
2c3a0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2c3b0 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65      /* Single re
2c3c0 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
2c3d0 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
2c3e0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
2c3f0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2c400 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2c410 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c420 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73      /* Result is
2c430 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2c440 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
2c450 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e  tricmp(pExpr->u.
2c460 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20  zToken,"count") 
2c470 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2c480 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28 29 20  Must be count() 
2c490 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
2c4a0 78 2e 70 4c 69 73 74 21 3d 30 20 29 20 72 65 74  x.pList!=0 ) ret
2c4b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2c4c0 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
2c4d0 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20  e count(*) */.  
2c4e0 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  if( p->pSrc->nSr
2c4f0 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
2c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c510 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69    /* One table i
2c520 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2c530 65 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d  e */.  pSub = p-
2c540 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
2c550 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d  ect;.  if( pSub=
2c560 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
2c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c580 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c590 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65  FROM is a subque
2c5a0 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ry */.  if( pSub
2c5b0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65  ->pPrior==0 ) re
2c5c0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
2c5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
2c5e0 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t be a compound 
2c5f0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 64 6f  subquery */.  do
2c600 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
2c610 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53  op!=TK_ALL && pS
2c620 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74  ub->pPrior ) ret
2c630 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20  urn 0;  /* Must 
2c640 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a  be UNION ALL */.
2c650 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57      if( pSub->pW
2c660 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
2c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c680 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52        /* No WHER
2c690 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  E clause */.    
2c6a0 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
2c6b0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2c6c0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
2c6d0 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67 72    /* Not an aggr
2c6e0 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70 53 75  egate */.    pSu
2c6f0 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  b = pSub->pPrior
2c700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c720 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20 63 6f  * Repeat over co
2c730 6d 70 6f 75 6e 64 20 74 65 72 6d 73 20 2a 2f 0a  mpound terms */.
2c740 20 20 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29    }while( pSub )
2c750 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
2c760 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
2c770 74 68 61 74 20 6d 65 61 6e 73 20 69 74 20 69 73  that means it is
2c780 20 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74   OK to perform t
2c790 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  he transformatio
2c7a0 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61  n */..  db = pPa
2c7b0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e  rse->db;.  pCoun
2c7c0 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78  t = pExpr;.  pEx
2c7d0 70 72 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d  pr = 0;.  pSub =
2c7e0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
2c7f0 53 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72  Select;.  p->pSr
2c800 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
2c810 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  = 0;.  sqlite3Sr
2c820 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
2c830 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70  p->pSrc);.  p->p
2c840 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Src = sqlite3DbM
2c850 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
2c860 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d  ->db, sizeof(*p-
2c870 3e 70 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65  >pSrc));.  while
2c880 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78  ( pSub ){.    Ex
2c890 70 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70  pr *pTerm;.    p
2c8a0 50 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50  Prior = pSub->pP
2c8b0 72 69 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e  rior;.    pSub->
2c8c0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
2c8d0 70 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pSub->pNext = 0;
2c8e0 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c  .    pSub->selFl
2c8f0 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67  ags |= SF_Aggreg
2c900 61 74 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73  ate;.    pSub->s
2c910 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43  elFlags &= ~SF_C
2c920 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75  ompound;.    pSu
2c930 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  b->nSelectRow = 
2c940 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  0;.    sqlite3Ex
2c950 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2c960 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
2c970 20 20 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69      pTerm = pPri
2c980 6f 72 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72  or ? sqlite3Expr
2c990 44 75 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20  Dup(db, pCount, 
2c9a0 30 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20  0) : pCount;.   
2c9b0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20   pSub->pEList = 
2c9c0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
2c9d0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
2c9e0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65   pTerm);.    pTe
2c9f0 72 6d 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  rm = sqlite3PExp
2ca00 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c  r(pParse, TK_SEL
2ca10 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ECT, 0, 0);.    
2ca20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53  sqlite3PExprAddS
2ca30 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  elect(pParse, pT
2ca40 65 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20  erm, pSub);.    
2ca50 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
2ca60 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 54        pExpr = pT
2ca70 65 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  erm;.    }else{.
2ca80 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
2ca90 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
2caa0 65 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72  e, TK_PLUS, pTer
2cab0 6d 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m, pExpr);.    }
2cac0 0a 20 20 20 20 70 53 75 62 20 3d 20 70 50 72 69  .    pSub = pPri
2cad0 6f 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c  or;.  }.  p->pEL
2cae0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20  ist->a[0].pExpr 
2caf0 3d 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65  = pExpr;.  p->se
2cb00 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67  lFlags &= ~SF_Ag
2cb10 67 72 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45  gregate;..#if SE
2cb20 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2cb30 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
2cb40 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34  electTrace & 0x4
2cb50 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
2cb60 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
2cb70 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75  se,p,("After cou
2cb80 6e 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d  nt-of-view optim
2cb90 69 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  ization:\n"));. 
2cba0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2cbb0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2cbc0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2cbd0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2cbe0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55  if /* SQLITE_COU
2cbf0 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a  NTOFVIEW_OPTIMIZ
2cc00 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ATION */../*.** 
2cc10 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
2cc20 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
2cc30 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
2cc40 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
2cc50 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
2cc60 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  lts are returned
2cc70 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
2cc80 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  e SelectDest str
2cc90 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63  ucture..** See c
2cca0 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74  omments in sqlit
2ccb0 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68  eInt.h for furth
2ccc0 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  er information..
2ccd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2cce0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
2ccf0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
2cd00 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
2cd10 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
2cd20 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
2cd30 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
2cd40 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
2cd50 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
2cd60 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
2cd70 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
2cd80 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
2cd90 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2cda0 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
2cdb0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
2cdc0 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
2cdd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
2cde0 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
2cdf0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2ce00 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2ce10 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
2ce20 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
2ce30 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2ce40 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
2ce50 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65  coded. */.  Sele
2ce60 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
2ce70 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
2ce80 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20   with the query 
2ce90 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
2cea0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
2ceb0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2cec0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
2ced0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
2cee0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72      /* Return fr
2cef0 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  om sqlite3WhereB
2cf00 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65  egin() */.  Vdbe
2cf10 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
2cf20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2cf30 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20  l machine under 
2cf40 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
2cf50 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20    int isAgg;    
2cf60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2cf70 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74   for select list
2cf80 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29  s like "count(*)
2cf90 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  " */.  ExprList 
2cfa0 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a  *pEList = 0;  /*
2cfb0 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   List of columns
2cfc0 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a   to extract. */.
2cfd0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2cfe0 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist;     /* List
2cff0 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
2d000 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45  lect from */.  E
2d010 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
2d020 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2d030 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  RE clause.  May 
2d040 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
2d050 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
2d060 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
2d070 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
2d080 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
2d090 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
2d0a0 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
2d0b0 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
2d0c0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
2d0d0 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
2d0e0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
2d0f0 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
2d100 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44   function */.  D
2d110 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74  istinctCtx sDist
2d120 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e  inct; /* Info on
2d130 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
2d140 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
2d150 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73  d */.  SortCtx s
2d160 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Sort;         /*
2d170 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
2d180 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42  code the ORDER B
2d190 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67  Y clause */.  Ag
2d1a0 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
2d1b0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
2d1c0 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
2d1d0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
2d1e0 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
2d1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2d200 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
2d210 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
2d220 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
2d230 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d240 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2d250 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ion */..#ifndef 
2d260 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2d270 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f  AIN.  int iResto
2d280 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  reSelectId = pPa
2d290 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a  rse->iSelectId;.
2d2a0 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63    pParse->iSelec
2d2b0 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e  tId = pParse->iN
2d2c0 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23  extSelectId++;.#
2d2d0 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50  endif..  db = pP
2d2e0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
2d2f0 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
2d300 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
2d310 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
2d320 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2d330 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
2d340 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
2d350 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
2d360 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
2d370 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
2d380 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
2d390 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53  AggInfo));.#if S
2d3a0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2d3b0 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  ED.  pParse->nSe
2d3c0 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20  lectIndent++;.  
2d3d0 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
2d3e0 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20  arse,p, ("begin 
2d3f0 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29  processing:\n"))
2d400 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
2d410 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
2d420 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  00 ){.    sqlite
2d430 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2d440 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2d450 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
2d460 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
2d470 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
2d480 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a  SRT_DistFifo );.
2d490 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2d4a0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2d4b0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69  t->eDest!=SRT_Fi
2d4c0 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fo );.  assert( 
2d4d0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
2d4e0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
2d4f0 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b  SRT_DistQueue );
2d500 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2d510 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2d520 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51  st->eDest!=SRT_Q
2d530 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67  ueue );.  if( Ig
2d540 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
2d550 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73  Dest) ){.    ass
2d560 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
2d570 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
2d580 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2d590 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
2d5a0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2d5b0 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
2d5c0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2d5d0 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a  =SRT_Discard ||.
2d5e0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2d5f0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65  ->eDest==SRT_Que
2d600 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ue  || pDest->eD
2d610 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
2d620 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  o ||.           
2d630 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2d640 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70  T_DistQueue || p
2d650 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d660 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49  _Fifo);.    /* I
2d670 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73  f ORDER BY makes
2d680 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69   no difference i
2d690 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65  n the output the
2d6a0 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20  n neither does. 
2d6b0 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73     ** DISTINCT s
2d6c0 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f  o it can be remo
2d6d0 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20  ved too. */.    
2d6e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2d6f0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
2d700 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70  derBy);.    p->p
2d710 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2d720 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
2d730 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
2d740 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
2d750 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c  tPrep(pParse, p,
2d760 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73   0);.  memset(&s
2d770 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Sort, 0, sizeof(
2d780 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74  sSort));.  sSort
2d790 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
2d7a0 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c  OrderBy;.  pTabL
2d7b0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2d7c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2d7d0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
2d7e0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
2d7f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2d800 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
2d810 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73  EList!=0 );.  is
2d820 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
2d830 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2d840 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43  e)!=0;.#if SELEC
2d850 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2d860 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2d870 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2d880 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
2d890 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
2d8a0 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20  p, ("after name 
2d8b0 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29  resolution:\n"))
2d8c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2d8d0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2d8e0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2d8f0 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69  ..  /* Get a poi
2d900 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75 6e  nter the VDBE un
2d910 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
2d920 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  , allocating a n
2d930 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20  ew VDBE if one. 
2d940 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   ** does not alr
2d950 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  eady exist */.  
2d960 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
2d970 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
2d980 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
2d990 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 69 66 28 20  lect_end;.  if( 
2d9a0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2d9b0 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
2d9c0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
2d9d0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
2d9e0 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f    }..  /* Try to
2d9f0 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
2da00 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2da10 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74  clause up into t
2da20 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20  he main query.  
2da30 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2da40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2da50 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
2da60 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2da70 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
2da80 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
2da90 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2daa0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2dab0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2dac0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2dad0 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
2dae0 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2daf0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
2db00 74 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20  t isAggSub;.    
2db10 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
2db20 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
2db30 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
2db40 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43  tinue;..    /* C
2db50 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e  atch mismatch in
2db60 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f   the declared co
2db70 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20  lumns of a view 
2db80 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
2db90 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  f.    ** columns
2dba0 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f   in the SELECT o
2dbb0 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20  n the RHS */.   
2dbc0 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21   if( pTab->nCol!
2dbd0 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e  =pSub->pEList->n
2dbe0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
2dbf0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2dc00 61 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20  arse, "expected 
2dc10 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27  %d columns for '
2dc20 25 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c  %s' but got %d",
2dc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dc40 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
2dc50 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  l, pTab->zName, 
2dc60 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
2dc70 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  xpr);.      goto
2dc80 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2dc90 20 7d 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62   }..    isAggSub
2dca0 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61   = (pSub->selFla
2dcb0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2dcc0 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66  e)!=0;.    if( f
2dcd0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
2dce0 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41  Parse, p, i, isA
2dcf0 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b  gg, isAggSub) ){
2dd00 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
2dd10 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61  ubquery can be a
2dd20 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73  bsorbed into its
2dd30 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
2dd40 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29    if( isAggSub )
2dd50 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20  {.        isAgg 
2dd60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
2dd70 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
2dd80 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20  ggregate;.      
2dd90 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a  }.      i = -1;.
2dda0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69      }.    pTabLi
2ddb0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2ddc0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2ddd0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
2dde0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66  lect_end;.    if
2ddf0 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  ( !IgnorableOrde
2de00 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
2de10 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
2de20 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
2de30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2de40 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
2de50 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
2de60 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e  _SELECT.  /* Han
2de70 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  dle compound SEL
2de80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75  ECT statements u
2de90 73 69 6e 67 20 74 68 65 20 73 65 70 61 72 61 74  sing the separat
2dea0 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a  e multiSelect().
2deb0 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a    ** procedure..
2dec0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
2ded0 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  rior ){.    rc =
2dee0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
2def0 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
2df00 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2df10 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
2df20 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
2df30 65 53 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20  eSelectId);.#if 
2df40 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2df50 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52  LED.    SELECTTR
2df60 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
2df70 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  "end compound-se
2df80 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c  lect processing\
2df90 6e 22 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65  n"));.    pParse
2dfa0 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d  ->nSelectIndent-
2dfb0 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  -;.#endif.    re
2dfc0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2dfd0 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61  dif..  /* For ea
2dfe0 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ch term in the F
2dff0 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74  ROM clause, do t
2e000 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20  wo things:.  ** 
2e010 28 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75  (1) Authorized u
2e020 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
2e030 65 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65  es.  ** (2) Gene
2e040 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
2e050 6c 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20  l sub-queries.  
2e060 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2e070 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2e080 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2e090 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2e0a0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2e0b0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
2e0c0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
2e0d0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 0a   Select *pSub;..
2e0e0 20 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c      /* Issue SQL
2e0f0 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69  ITE_READ authori
2e100 7a 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66  zations with a f
2e110 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
2e120 66 6f 72 20 61 6e 79 20 74 61 62 6c 65 73 20 74  for any tables t
2e130 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 72  hat.    ** are r
2e140 65 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72  eferenced but fr
2e150 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75  om which no valu
2e160 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  es are extracted
2e170 2e 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  . Examples of wh
2e180 65 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a  ere these.    **
2e190 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53   kinds of null S
2e1a0 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f  QLITE_READ autho
2e1b0 72 69 7a 61 74 69 6f 6e 73 20 77 6f 75 6c 64 20  rizations would 
2e1c0 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20  occur:.    **.  
2e1d0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2e1e0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
2e1f0 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45  ;   -- SQLITE_RE
2e200 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20  AD t1."".    ** 
2e210 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20      SELECT t1.* 
2e220 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d  FROM t1, t2;   -
2e230 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32  - SQLITE_READ t2
2e240 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ."".    **.    *
2e250 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d  * The fake colum
2e260 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70  n name is an emp
2e270 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69  ty string.  It i
2e280 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  s possible for a
2e290 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a   table to.    **
2e2a0 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e   have a column n
2e2b0 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70 74  amed by the empt
2e2c0 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69  y string, in whi
2e2d0 63 68 20 63 61 73 65 20 74 68 65 72 65 20 69 73  ch case there is
2e2e0 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a   no way to.    *
2e2f0 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65  * distinguish be
2e300 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72  tween an unrefer
2e310 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20  enced table and 
2e320 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72 65  an actual refere
2e330 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  nce to the.    *
2e340 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  * "" column.  Th
2e350 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
2e360 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20 66 61  n was for the fa
2e370 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74  ke column name t
2e380 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20  o be a NULL,.   
2e390 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
2e3a0 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20  be unambiguous. 
2e3b0 20 42 75 74 20 6c 65 67 61 63 79 20 61 75 74 68   But legacy auth
2e3c0 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
2e3d0 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a  cks might.    **
2e3e0 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75   assume the colu
2e3f0 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e  mn name is non-N
2e400 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74  ULL and segfault
2e410 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e  .  The use of an
2e420 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 20 20   empty string.  
2e430 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 66 61 6b    ** for the fak
2e440 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65  e column name se
2e450 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a  ems safer..    *
2e460 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2e470 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20  >colUsed==0 ){. 
2e480 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68       sqlite3Auth
2e490 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
2e4a0 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d  LITE_READ, pItem
2e4b0 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74  ->zName, "", pIt
2e4c0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
2e4d0 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
2e4e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2e4f0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
2e500 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2e510 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47  T_VIEW).    /* G
2e520 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2e530 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
2e540 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2e550 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  use.    */.    p
2e560 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
2e570 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53  lect;.    if( pS
2e580 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
2e590 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69  ;..    /* Someti
2e5a0 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  mes the code for
2e5b0 20 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c   a subquery will
2e5c0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f   be generated mo
2e5d0 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f  re than.    ** o
2e5e0 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71  nce, if the subq
2e5f0 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20  uery is part of 
2e600 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2e610 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   in a LEFT JOIN,
2e620 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d  .    ** for exam
2e630 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ple.  In that ca
2e640 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e  se, do not regen
2e650 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
2e660 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a  o manifest.    *
2e670 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20  * a view or the 
2e680 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d  co-routine to im
2e690 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20  plement a view. 
2e6a0 20 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61   The first insta
2e6b0 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75  nce.    ** is su
2e6c0 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68  fficient, though
2e6d0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
2e6e0 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20  to manifest the 
2e6f0 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20  view does need. 
2e700 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f     ** to be invo
2e710 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  ked again. */.  
2e720 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64    if( pItem->add
2e730 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20  rFillSub ){.    
2e740 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
2e750 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20  viaCoroutine==0 
2e760 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2e770 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
2e780 74 20 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20  t manifests the 
2e790 76 69 65 77 20 6d 69 67 68 74 20 62 65 20 61 20  view might be a 
2e7a0 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65  one-time routine
2e7b0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  ,.        ** or 
2e7c0 69 74 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  it might need to
2e7d0 20 62 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63   be rerun on eac
2e7e0 68 20 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61  h iteration beca
2e7f0 75 73 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a  use it.        *
2e800 2a 20 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72  * encodes a corr
2e810 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 2e  elated subquery.
2e820 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74   */.        test
2e830 63 61 73 65 28 20 73 71 6c 69 74 65 33 56 64 62  case( sqlite3Vdb
2e840 65 47 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d  eGetOp(v, pItem-
2e850 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f  >addrFillSub)->o
2e860 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29  pcode==OP_Once )
2e870 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e880 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2e890 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e  P_Gosub, pItem->
2e8a0 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  regReturn, pItem
2e8b0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a  ->addrFillSub);.
2e8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
2e8d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
2e8e0 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
2e8f0 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79  Parse.nHeight by
2e900 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74   the height of t
2e910 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65  he largest expre
2e920 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65  ssion.    ** tre
2e930 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  e referred to by
2e940 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
2e950 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
2e960 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
2e970 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
2e980 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
2e990 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
2e9a0 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
2e9b0 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
2e9c0 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
2e9d0 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
2e9e0 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
2e9f0 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
2ea00 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
2ea10 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
2ea20 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
2ea30 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
2ea40 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
2ea50 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
2ea60 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
2ea70 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  t(p);..    /* Ma
2ea80 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e  ke copies of con
2ea90 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75  stant WHERE-clau
2eaa0 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  se terms in the 
2eab0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e  outer query down
2eac0 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74  .    ** inside t
2ead0 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
2eae0 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20  is can help the 
2eaf0 73 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20  subquery to run 
2eb00 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
2eb10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2eb20 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pItem->fg.join
2eb30 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
2eb40 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 75 73 68  ==0.     && push
2eb50 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70  DownWhereTerms(p
2eb60 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e  Parse, pSub, p->
2eb70 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69  pWhere, pItem->i
2eb80 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23  Cursor).    ){.#
2eb90 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2eba0 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28  NABLED.      if(
2ebb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2ebc0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
2ebd0 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41         SELECTTRA
2ebe0 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
2ebf0 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45 2d  p,("After WHERE-
2ec00 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e  clause push-down
2ec10 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  :\n"));.        
2ec20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2ec30 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2ec40 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2ec50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
2ec60 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d  erate code to im
2ec70 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71  plement the subq
2ec80 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20  uery.    **.    
2ec90 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
2eca0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
2ecb0 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  s a co-routine i
2ecc0 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
2ecd0 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 20  re true:.    ** 
2ece0 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
2ecf0 65 72 79 20 69 73 20 67 75 61 72 61 6e 74 65 65  ery is guarantee
2ed00 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65  d to be the oute
2ed10 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20  r loop (so that 
2ed20 69 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  it.    **       
2ed30 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2ed40 6f 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6d 6f  o be computed mo
2ed50 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20  re than once).  
2ed60 20 20 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20    **   (2)  The 
2ed70 41 4c 4c 20 6b 65 79 77 6f 72 64 20 61 66 74 65  ALL keyword afte
2ed80 72 20 53 45 4c 45 43 54 20 69 73 20 6f 6d 69 74  r SELECT is omit
2ed90 74 65 64 2e 20 20 28 41 70 70 6c 69 63 61 74 69  ted.  (Applicati
2eda0 6f 6e 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 20  ons are.    **  
2edb0 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f        allowed to
2edc0 20 73 61 79 20 22 53 45 4c 45 43 54 20 41 4c 4c   say "SELECT ALL
2edd0 22 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73  " instead of jus
2ede0 74 20 22 53 45 4c 45 43 54 22 20 74 6f 20 64 69  t "SELECT" to di
2edf0 73 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20  sable.    **    
2ee00 20 20 20 20 74 68 65 20 75 73 65 20 6f 66 20 63      the use of c
2ee10 6f 2d 72 6f 75 74 69 6e 65 73 2e 29 0a 20 20 20  o-routines.).   
2ee20 20 2a 2a 20 20 20 28 33 29 20 20 43 6f 2d 72 6f   **   (3)  Co-ro
2ee30 75 74 69 6e 65 73 20 61 72 65 20 6e 6f 74 20 64  utines are not d
2ee40 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 73 71  isabled using sq
2ee50 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2ee60 6f 6c 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  ol().    **     
2ee70 20 20 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54     with SQLITE_T
2ee80 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
2ee90 54 49 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a 20 20  TIONS..    **.  
2eea0 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74    ** TODO: Are t
2eeb0 68 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f  here other reaso
2eec0 6e 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f  ns beside (1) to
2eed0 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e   use a co-routin
2eee0 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65  e.    ** impleme
2eef0 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a  ntation?.    */.
2ef00 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20      if( i==0.   
2ef10 20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e    && (pTabList->
2ef20 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
2ef30 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74      || (pTabList
2ef40 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[1].fg.jointy
2ef50 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43  pe&(JT_LEFT|JT_C
2ef60 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28  ROSS))!=0)  /* (
2ef70 31 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 28 70  1) */.     && (p
2ef80 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2ef90 41 6c 6c 29 3d 3d 30 20 20 20 20 20 20 20 20 20  All)==0         
2efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
2efc0 20 2a 2f 0a 20 20 20 20 20 26 26 20 4f 70 74 69   */.     && Opti
2efd0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2efe0 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43  db, SQLITE_SubqC
2eff0 6f 72 6f 75 74 69 6e 65 29 20 20 20 20 20 20 20  oroutine)       
2f000 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a          /* (3) *
2f010 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  /.    ){.      /
2f020 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f  * Implement a co
2f030 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  -routine that wi
2f040 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  ll return a sing
2f050 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
2f060 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
2f070 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  t on each invoca
2f080 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
2f090 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2f0a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2f0b0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a  rrentAddr(v)+1;.
2f0c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
2f0d0 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
2f0e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
2f0f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2f100 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
2f110 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2f120 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54  Return, 0, addrT
2f130 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  op);.      VdbeC
2f140 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
2f150 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2f160 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ame));.      pIt
2f170 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2f180 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  = addrTop;.     
2f190 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2f1a0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
2f1b0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
2f1c0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2f1d0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2f1e0 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2f1f0 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
2f200 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2f210 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
2f220 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
2f230 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
2f240 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
2f250 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2f260 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2f270 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
2f280 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  g.viaCoroutine =
2f290 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   1;.      pItem-
2f2a0 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73  >regResult = des
2f2b0 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73  t.iSdst;.      s
2f2c0 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
2f2d0 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d  outine(v, pItem-
2f2e0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2f2f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2f300 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
2f310 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p-1);.      sqli
2f320 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
2f330 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
2f340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2f350 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
2f360 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
2f370 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65  l fill an epheme
2f380 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20  ral table with. 
2f390 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74       ** the cont
2f3a0 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71  ent of this subq
2f3b0 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64  uery.  pItem->ad
2f3c0 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70  drFillSub will p
2f3d0 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f  oint.      ** to
2f3e0 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2f3f0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75  the generated su
2f400 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d  broutine.  pItem
2f410 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20  ->regReturn.    
2f420 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74    ** is a regist
2f430 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  er allocated to 
2f440 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74  hold the subrout
2f450 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  ine return addre
2f460 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ss.      */.    
2f470 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20    int topAddr;. 
2f480 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64       int onceAdd
2f490 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
2f4a0 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20   retAddr;.      
2f4b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2f4c0 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20  tem *pPrior;..  
2f4d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
2f4e0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
2f4f0 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
2f500 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
2f510 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2f520 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
2f530 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f540 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2f550 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2f560 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
2f570 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
2f580 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
2f590 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
2f5a0 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
2f5b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2f5c0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
2f5d0 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
2f5e0 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
2f5f0 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
2f600 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
2f610 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
2f620 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
2f630 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
2f640 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
2f650 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
2f660 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
2f670 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
2f680 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
2f690 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2f6a0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2f6b0 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
2f6c0 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
2f6d0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2f6e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2f6f0 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
2f700 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
2f710 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
2f720 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2f730 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
2f740 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69        pPrior = i
2f750 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54  sSelfJoinView(pT
2f760 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a  abList, pItem);.
2f770 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
2f780 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f790 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f7a0 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74   OP_OpenDup, pIt
2f7b0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72  em->iCursor, pPr
2f7c0 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ior->iCursor);. 
2f7d0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65         explainSe
2f7e0 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2f7f0 69 53 65 6c 65 63 74 49 64 2c 20 70 50 72 69 6f  iSelectId, pPrio
2f800 72 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20  r->iSelectId);. 
2f810 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2f820 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d  Prior->pSelect!=
2f830 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75  0 );.        pSu
2f840 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  b->nSelectRow = 
2f850 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d  pPrior->pSelect-
2f860 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
2f870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f880 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2f890 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2f8a0 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
2f8b0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2f8c0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2f8d0 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2f8e0 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
2f8f0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2f900 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  tId);.        sq
2f910 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2f920 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2f930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f940 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
2f950 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e  wLogEst = pSub->
2f960 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
2f970 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
2f980 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2f990 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
2f9a0 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
2f9b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2f9c0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2f9d0 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
2f9e0 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
2f9f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
2fa00 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
2fa10 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2fa20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2fa30 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
2fa40 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
2fa50 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
2fa60 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
2fa70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2fa80 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2fa90 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
2faa0 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65  _end;.    pParse
2fab0 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
2fac0 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
2fad0 69 67 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a  ight(p);.#endif.
2fae0 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75    }..  /* Variou
2faf0 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  s elements of th
2fb00 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20  e SELECT copied 
2fb10 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61  into local varia
2fb20 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f  bles for.  ** co
2fb30 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70  nvenience */.  p
2fb40 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
2fb50 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  t;.  pWhere = p-
2fb60 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
2fb70 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
2fb80 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
2fb90 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69  ->pHaving;.  sDi
2fba0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20  stinct.isTnct = 
2fbb0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2fbc0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a  F_Distinct)!=0;.
2fbd0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2fbe0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2fbf0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2fc00 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
2fc10 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
2fc20 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
2fc30 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  ter all FROM-cla
2fc40 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  use analysis:\n"
2fc50 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2fc60 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2fc70 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2fc80 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
2fc90 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
2fca0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
2fcb0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2fcc0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2fcd0 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53  QueryFlattener|S
2fce0 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65  QLITE_CountOfVie
2fcf0 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66  w).   && countOf
2fd00 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
2fd10 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b  (pParse, p).  ){
2fd20 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2fd30 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2fd40 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2fd50 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
2fd60 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  ist;.    pTabLis
2fd70 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d  t = p->pSrc;.  }
2fd80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2fd90 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
2fda0 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
2fdb0 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
2fdc0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
2fdd0 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
2fde0 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
2fdf0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2fe00 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
2fe10 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
2fe20 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
2fe30 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
2fe40 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
2fe50 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
2fe60 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2fe70 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
2fe80 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
2fe90 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
2fea0 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
2feb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
2fec0 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
2fed0 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
2fee0 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
2fef0 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
2ff00 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
2ff10 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
2ff20 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
2ff30 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
2ff40 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
2ff50 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
2ff60 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
2ff70 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
2ff80 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
2ff90 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
2ffa0 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
2ffb0 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
2ffc0 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
2ffd0 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
2ffe0 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
2fff0 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
30000 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
30010 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
30020 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
30030 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
30040 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
30050 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
30060 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
30070 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
30080 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
30090 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
300a0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
300b0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
300c0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
300d0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
300e0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
300f0 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
30100 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
30110 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
30120 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
30130 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
30140 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
30150 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
30160 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
30170 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
30180 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
30190 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
301a0 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
301b0 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
301c0 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
301d0 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
301e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
301f0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
30200 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
30210 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
30220 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
30230 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
30240 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
30250 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
30260 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44  ,p,("Transform D
30270 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f  ISTINCT into GRO
30280 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20  UP BY:\n"));.   
30290 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
302a0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
302b0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
302c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
302d0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
302e0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
302f0 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
30300 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
30310 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
30320 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
30330 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
30340 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
30350 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
30360 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
30370 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
30380 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
30390 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
303a0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
303b0 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
303c0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
303d0 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
303e0 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
303f0 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
30400 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
30410 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
30420 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
30430 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
30440 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
30450 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
30460 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
30470 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
30480 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
30490 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
304a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
304b0 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
304c0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
304d0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53  rList(pParse, sS
304e0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
304f0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
30500 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
30510 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
30520 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
30530 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
30540 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30550 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
30560 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
30570 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
30580 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
30590 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
305a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
305b0 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
305c0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
305d0 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
305e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
305f0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
30600 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
30610 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
30620 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
30630 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
30640 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
30650 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
30660 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
30670 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
30680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30690 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
306a0 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
306b0 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
306c0 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
306d0 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
306e0 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
306f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
30700 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28  abel(v);.  if( (
30710 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
30720 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20  _FixedLimit)==0 
30730 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  ){.    p->nSelec
30740 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
30750 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
30760 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c  /.  }.  computeL
30770 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
30780 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
30790 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
307a0 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
307b0 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
307c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
307d0 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
307e0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
307f0 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
30800 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
30810 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
30820 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
30830 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
30840 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
30850 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
30860 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
30870 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
30880 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
30890 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
308a0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
308b0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
308c0 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
308d0 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
308e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
308f0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
30900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30910 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
30920 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
30930 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
30940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30950 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46   (char*)keyInfoF
30960 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
30970 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
30980 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
30990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309a0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
309b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
309c0 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
309d0 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
309e0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
309f0 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
30a00 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
30a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
30a20 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
30a30 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
30a40 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
30a50 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
30a60 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
30a70 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
30a80 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
30a90 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
30aa0 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
30ab0 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
30ac0 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
30ad0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
30ae0 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
30af0 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  ( WHERE_USE_LIMI
30b00 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  T==SF_FixedLimit
30b10 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   );.    wctrlFla
30b20 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  gs |= p->selFlag
30b30 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
30b40 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  t;..    /* Begin
30b50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
30b60 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66  an. */.    pWInf
30b70 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
30b80 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
30b90 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
30ba0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a  sSort.pOrderBy,.
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
30bd0 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46  ->pEList, wctrlF
30be0 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74  lags, p->nSelect
30bf0 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Row);.    if( pW
30c00 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
30c10 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
30c20 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
30c30 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
30c40 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
30c50 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
30c60 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
30c70 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
30c80 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
30c90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30ca0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
30cb0 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
30cc0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
30cd0 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
30ce0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
30cf0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
30d00 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
30d10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30d20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
30d30 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
30d40 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
30d50 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
30d60 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f  Info);.      sSo
30d70 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  rt.bOrderedInner
30d80 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68  Loop = sqlite3Wh
30d90 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ereOrderedInnerL
30da0 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  oop(pWInfo);.   
30db0 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
30dc0 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
30dd0 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
30de0 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
30df0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
30e00 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
30e10 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
30e20 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
30e30 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
30e40 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
30e50 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
30e60 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
30e70 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
30e80 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
30e90 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
30ea0 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
30eb0 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
30ec0 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
30ed0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
30ee0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
30ef0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
30f00 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
30f10 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
30f20 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
30f30 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
30f40 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
30f50 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73  loop. */.    ass
30f60 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d  ert( p->pEList==
30f70 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65  pEList );.    se
30f80 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
30f90 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53  arse, p, -1, &sS
30fa0 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
30fb0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
30fc0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
30fd0 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
30fe0 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
30ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31000 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
31010 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
31020 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
31030 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
31040 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
31050 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
31060 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
31070 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
31080 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
31090 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
310a0 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
310b0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
310c0 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
310d0 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
310e0 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
310f0 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
31100 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
31110 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
31120 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
31130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
31140 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
31150 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
31160 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
31170 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
31180 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
31190 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
311a0 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
311b0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
311c0 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
311d0 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
311e0 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
311f0 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
31200 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
31210 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
31220 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
31230 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
31240 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
31250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31260 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
31270 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
31280 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
31290 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
312a0 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
312b0 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
312c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
312d0 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
312e0 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
312f0 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
31300 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
31310 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
31320 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
31330 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
31340 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
31350 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
31360 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
31370 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
31380 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
31390 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
313a0 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
313b0 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
313c0 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
313d0 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79  .    int orderBy
313e0 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  Grp = 0; /* True
313f0 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59   if the GROUP BY
31400 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72   and ORDER BY ar
31410 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20  e the same */.. 
31420 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
31430 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
31440 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
31450 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
31460 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
31470 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
31480 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
31490 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
314a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
314c0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
314d0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
314e0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
314f0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
31500 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
31510 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
31520 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
31530 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
31540 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
31550 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
31560 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
31570 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
31580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
31590 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
315a0 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
315b0 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
315c0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
315d0 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
315e0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
315f0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
31600 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
31610 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20  st(100) );.     
31620 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
31630 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65  ow>66 ) p->nSele
31640 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20  ctRow = 66;.    
31650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
31660 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c  ert( 0==sqlite3L
31670 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20  ogEst(1) );.    
31680 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
31690 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
316a0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
316b0 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61  oth a GROUP BY a
316c0 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  nd an ORDER BY c
316d0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61  lause and they a
316e0 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69  re.    ** identi
316f0 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  cal, then it may
31700 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
31710 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45  disable the ORDE
31720 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20  R BY clause .   
31730 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e   ** on the groun
31740 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55  ds that the GROU
31750 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20  P BY will cause 
31760 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
31770 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20   out .    ** in 
31780 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
31790 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e  r. It also may n
317a0 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42  ot - the GROUP B
317b0 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20  Y might use a.  
317c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e    ** database in
317d0 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20  dex that causes 
317e0 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70  rows to be group
317f0 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72  ed together as r
31800 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62  equired.    ** b
31810 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ut not actually 
31820 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77  sorted. Either w
31830 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ay, record the f
31840 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20  act that the.   
31850 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64   ** ORDER BY and
31860 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
31870 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62  s are the same b
31880 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72  y setting the or
31890 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20  derByGrp.    ** 
318a0 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
318b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
318c0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72  rListCompare(pGr
318d0 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72  oupBy, sSort.pOr
318e0 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b  derBy, -1)==0 ){
318f0 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72  .      orderByGr
31900 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20  p = 1;.    }. . 
31910 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
31920 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
31930 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
31940 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
31950 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
31960 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
31970 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
31980 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
31990 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
319a0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
319b0 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
319c0 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
319d0 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
319e0 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
319f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
31a00 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
31a10 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
31a20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
31a30 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
31a40 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
31a50 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
31a60 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
31a70 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
31a80 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
31a90 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
31aa0 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20  AggInfo.mnReg = 
31ab0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
31ac0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
31ad0 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
31ae0 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
31af0 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  y->nExpr : 0;.  
31b00 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
31b10 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
31b20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
31b30 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
31b40 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
31b50 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
31b60 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
31b70 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29   sSort.pOrderBy)
31b80 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
31b90 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
31ba0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
31bb0 20 20 20 61 73 73 65 72 74 28 20 70 57 68 65 72     assert( pWher
31bc0 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a  e==p->pWhere );.
31bd0 20 20 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f          havingTo
31be0 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 70 47  Where(pParse, pG
31bf0 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c  roupBy, pHaving,
31c00 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
31c10 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 70        pWhere = p
31c20 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  ->pWhere;.      
31c30 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
31c40 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
31c50 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
31c60 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ng);.    }.    s
31c70 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
31c80 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
31c90 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
31ca0 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
31cb0 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
31cc0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
31cd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67  rHasProperty(sAg
31ce0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
31cf0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
31d00 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
31d10 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49  .ncFlags |= NC_I
31d20 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20  nAggFunc;.      
31d30 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
31d40 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
31d50 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
31d60 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ].pExpr->x.pList
31d70 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
31d80 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67  lags &= ~NC_InAg
31d90 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20  gFunc;.    }.   
31da0 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20   sAggInfo.mxReg 
31db0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
31dc0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
31dd0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
31de0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
31df0 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
31e00 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
31e10 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
31e20 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
31e30 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
31e40 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
31e50 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
31e60 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
31e70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
31e80 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
31e90 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
31ea0 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
31eb0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
31ec0 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
31ed0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
31ee0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f  ddr1;          /
31ef0 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
31f00 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
31f10 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
31f20 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
31f30 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
31f40 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
31f50 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
31f60 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
31f70 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
31f80 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
31f90 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
31fa0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
31fb0 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
31fc0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
31fd0 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
31fe0 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
31ff0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
32000 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
32010 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
32020 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
32030 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
32040 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
32050 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
32060 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
32070 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
32080 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
32090 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
320a0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
320b0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
320c0 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
320d0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
320e0 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
320f0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
32100 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
32110 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
32120 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
32130 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
32140 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
32150 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
32160 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
32170 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
32180 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
32190 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
321a0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
321b0 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
321c0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  OP_SorterOpen in
321d0 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
321e0 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
321f0 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
32200 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
32210 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
32220 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
32230 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
32240 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
32250 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
32260 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
32270 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c  0, sAggInfo.nCol
32280 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72  umn);.      addr
32290 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
322a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
322b0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
322c0 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
322d0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
322e0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
322f0 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
32300 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
32310 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
32320 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
32330 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
32340 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
32350 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
32360 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
32370 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
32380 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
32390 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
323a0 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
323b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
323c0 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
323d0 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
323e0 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
323f0 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
32400 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
32410 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
32420 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
32430 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
32440 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
32450 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
32460 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
32470 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
32480 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
32490 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
324a0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
324b0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
324c0 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
324d0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
324e0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
324f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32500 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
32510 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
32520 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
32530 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
32540 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
32550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32560 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
32570 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c  teger, 0, iUseFl
32580 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
32590 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
325a0 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  cate accumulator
325b0 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20   empty"));.     
325c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
325d0 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
325e0 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70  , iAMem, iAMem+p
325f0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31  GroupBy->nExpr-1
32600 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
32610 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
32620 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
32630 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
32640 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
32650 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
32660 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
32670 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
32680 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
32690 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
326a0 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
326b0 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
326c0 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
326d0 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
326e0 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
326f0 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
32700 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
32710 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
32720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32730 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
32740 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
32750 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
32760 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
32770 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
32780 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
32790 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  re, pGroupBy, 0,
327a0 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
327b0 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65  _GROUPBY | (orde
327c0 72 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53  rByGrp ? WHERE_S
327d0 4f 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c  ORTBYGROUP : 0),
327e0 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
327f0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
32800 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
32810 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  d;.      if( sql
32820 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
32830 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f  ed(pWInfo)==pGro
32840 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  upBy->nExpr ){. 
32850 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
32860 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
32870 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
32880 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
32890 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
328a0 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
328b0 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
328c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61  OpenEphemeral ta
328d0 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ble will be.    
328e0 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64      ** cancelled
328f0 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77   later because w
32900 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
32910 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f  use the pKeyInfo
32920 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
32930 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
32940 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
32950 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  {.        /* Row
32960 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74  s are coming out
32970 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64   in undetermined
32980 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65   order.  We have
32990 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20   to push.       
329a0 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74   ** each row int
329b0 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
329c0 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  x, terminate the
329d0 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20   first loop,.   
329e0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f       ** then loo
329f0 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69  p over the sorti
32a00 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65  ng index in orde
32a10 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74  r to get the out
32a20 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  put.        ** i
32a30 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20  n sorted order. 
32a40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32a50 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20    int regBase;. 
32a60 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65         int regRe
32a70 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  cord;.        in
32a80 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t nCol;.        
32a90 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20  int nGroupBy;.. 
32aa0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65         explainTe
32ab0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
32ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44  .            (sD
32ad0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
32ae0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53  & (p->selFlags&S
32af0 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20  F_Distinct)==0) 
32b00 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
32b10 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22        "DISTINCT"
32b20 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a   : "GROUP BY");.
32b30 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
32b40 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
32b50 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
32b60 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
32b70 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
32b80 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a  oupBy;.        j
32b90 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
32ba0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
32bb0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
32bc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
32bd0 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61    if( sAggInfo.a
32be0 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f  Col[i].iSorterCo
32bf0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
32c00 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20         nCol++;. 
32c10 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
32c20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32c30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
32c40 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
32c50 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
32c60 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
32c70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
32c80 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
32c90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32ca0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
32cb0 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
32cc0 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20  By, regBase, 0, 
32cd0 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  0);.        j = 
32ce0 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
32cf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
32d00 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
32d10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
32d20 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
32d30 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
32d40 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
32d50 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
32d60 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
32d70 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
32d80 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
32d90 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
32da0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
32db0 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67  deGetColumnToReg
32dc0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
32dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32de0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
32df0 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75  Tab, pCol->iColu
32e00 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  mn, pCol->iTable
32e10 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
32e20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
32e30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
32e40 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20        regRecord 
32e50 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
32e60 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
32e70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
32e80 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
32e90 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
32ea0 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72  , nCol, regRecor
32eb0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
32ec0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
32ed0 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
32ee0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
32ef0 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64  ngIdx, regRecord
32f00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
32f10 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
32f20 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
32f30 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
32f40 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
32f50 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
32f60 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  Base, nCol);.   
32f70 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
32f80 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
32f90 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
32fa0 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20  ortingIdxPTab = 
32fb0 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73  sortPTab = pPars
32fc0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
32fd0 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c     sortOut = sql
32fe0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
32ff0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
33000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33010 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
33020 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f  do, sortPTab, so
33030 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rtOut, nCol);.  
33040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33050 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
33060 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e  rterSort, sAggIn
33070 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
33080 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  ddrEnd);.       
33090 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
330a0 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22   "GROUP BY sort"
330b0 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  )); VdbeCoverage
330c0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  (v);.        sAg
330d0 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
330e0 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Idx = 1;.       
330f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
33100 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
33110 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33120 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
33130 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  or temporary tab
33140 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47  le used by the G
33150 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20  ROUP BY sort.   
33160 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72     ** will natur
33170 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77  ally deliver row
33180 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72  s in the order r
33190 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f  equired by the O
331a0 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a  RDER BY.      **
331b0 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20   clause, cancel 
331c0 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
331d0 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65  ble open coded e
331e0 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a  arlier..      **
331f0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
33200 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
33210 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20  n - the correct 
33220 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65  answer should re
33230 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e  sult regardless.
33240 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68  .      ** Use th
33250 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  e SQLITE_GroupBy
33260 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20  Order flag with 
33270 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
33280 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20  OPTIMIZER to .  
33290 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
332a0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
332b0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
332c0 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20  poses.  */.     
332d0 20 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20   if( orderByGrp 
332e0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
332f0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
33300 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20  E_GroupByOrder) 
33310 0a 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75  .       && (grou
33320 70 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74  pBySort || sqlit
33330 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28  e3WhereIsSorted(
33340 70 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29  pWInfo)).      )
33350 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e  {.        sSort.
33360 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
33370 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33380 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
33390 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
333a0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ndex);.      }..
333b0 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
333c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
333d0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64  OUP BY terms and
333e0 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31   store in b0, b1
333f0 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  , b2....      **
33400 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c   (b0 is memory l
33410 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c  ocation iBMem+0,
33420 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20   b1 is iBMem+1, 
33430 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20  and so forth).  
33440 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70      ** Then comp
33450 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  are the current 
33460 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
33470 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50  gainst the GROUP
33480 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20   BY terms.      
33490 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  ** from the prev
334a0 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74  ious row current
334b0 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c  ly stored in a0,
334c0 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20   a1, a2....     
334d0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f   */.      addrTo
334e0 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  pOfLoop = sqlite
334f0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
33500 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
33510 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
33520 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
33530 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
33540 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
33550 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
33560 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73  OP_SorterData, s
33570 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
33580 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx,.            
33590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f                so
335a0 72 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29  rtOut, sortPTab)
335b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
335c0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
335d0 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
335e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
335f0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
33600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33610 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
33620 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c  olumn, sortPTab,
33630 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20   j, iBMem+j);.  
33640 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33650 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
33660 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
33670 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33680 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
33690 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
336a0 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29  .pExpr, iBMem+j)
336b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
336c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
336d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
336e0 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d  P_Compare, iAMem
336f0 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iBMem, pGroupB
33700 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  y->nExpr,.      
33710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33720 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
33730 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
33740 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
33750 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  FO);.      addr1
33760 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
33770 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
33780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33790 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
337a0 2c 20 61 64 64 72 31 2b 31 2c 20 30 2c 20 61 64  , addr1+1, 0, ad
337b0 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  dr1+1); VdbeCove
337c0 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20  rage(v);..      
337d0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
337e0 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
337f0 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
33800 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
33810 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68  ** Changes in th
33820 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
33830 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
33840 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
33850 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
33860 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
33870 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
33880 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
33890 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
338a0 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
338b0 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
338c0 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
338d0 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
338e0 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
338f0 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
33900 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
33910 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
33920 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
33930 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
33940 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
33950 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
33960 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
33970 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
33980 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
33990 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
339a0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
339b0 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70   iBMem, iAMem, p
339c0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b  GroupBy->nExpr);
339d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
339e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
339f0 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
33a00 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
33a10 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
33a20 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
33a30 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
33a40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33a50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
33a60 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
33a70 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  ddrEnd); VdbeCov
33a80 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
33a90 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
33aa0 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61  "check abort fla
33ab0 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
33ac0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
33ad0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
33ae0 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
33af0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
33b00 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63  nt((v, "reset ac
33b10 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
33b20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
33b30 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
33b40 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20  umulators based 
33b50 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  on the content o
33b60 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  f.      ** the c
33b70 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20  urrent row.     
33b80 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
33b90 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
33ba0 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 75   addr1);.      u
33bb0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
33bc0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
33bd0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
33be0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
33bf0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
33c00 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
33c10 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
33c20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69  "indicate data i
33c30 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  n accumulator"))
33c40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
33c50 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
33c60 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
33c70 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
33c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33c90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
33ca0 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e  rterNext, sAggIn
33cb0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
33cc0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
33cd0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
33ce0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
33cf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
33d00 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
33d10 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
33d20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
33d30 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72  oNoop(v, addrSor
33d40 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20  tingIdx);.      
33d50 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70  }..      /* Outp
33d60 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ut the final row
33d70 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20   of result.     
33d80 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
33d90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
33da0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
33db0 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
33dc0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
33dd0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
33de0 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29  tput final row")
33df0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d  );..      /* Jum
33e00 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f  p over the subro
33e10 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a  utines.      */.
33e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33e30 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64  eGoto(v, addrEnd
33e40 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
33e50 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
33e60 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
33e70 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
33e80 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
33e90 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
33ea0 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
33eb0 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
33ec0 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
33ed0 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
33ee0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
33ef0 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
33f00 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
33f10 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
33f20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
33f30 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
33f40 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
33f50 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
33f60 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
33f70 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
33f80 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
33f90 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
33fa0 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
33fb0 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
33fc0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
33fd0 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
33fe0 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
33ff0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
34000 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
34010 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34020 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
34030 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46  eger, 1, iAbortF
34040 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
34050 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74  Comment((v, "set
34060 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
34070 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34080 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
34090 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
340a0 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
340b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
340c0 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74  el(v, addrOutput
340d0 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72  Row);.      addr
340e0 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
340f0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
34100 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
34110 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
34120 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65  , OP_IfPos, iUse
34130 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
34140 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64  Row+2);.      Vd
34150 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
34160 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34170 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
34180 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
34190 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
341a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
341b0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
341c0 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
341d0 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
341e0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
341f0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
34200 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34210 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
34220 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
34230 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
34240 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
34250 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
34260 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
34270 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20  p, -1, &sSort,. 
34280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34290 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c       &sDistinct,
342a0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
342b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
342c0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
342d0 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
342e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
342f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
34300 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
34310 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
34320 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
34330 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
34340 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
34350 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
34360 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
34370 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
34380 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
34390 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
343a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
343b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
343c0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
343d0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
343e0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
343f0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
34400 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
34410 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
34420 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
34430 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
34440 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
34450 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
34460 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
34470 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
34480 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
34490 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
344a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
344b0 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
344c0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
344d0 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
344e0 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
344f0 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
34500 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
34510 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
34520 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
34530 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
34540 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
34550 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
34560 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
34570 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
34580 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
34590 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
345a0 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
345b0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
345c0 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
345d0 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
345e0 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
345f0 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
34600 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
34610 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
34620 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
34630 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
34640 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
34650 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
34660 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
34670 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
34680 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
34690 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
346a0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
346b0 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
346c0 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
346d0 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
346e0 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
346f0 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
34700 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
34710 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
34720 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
34730 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
34740 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
34750 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
34760 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
34770 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
34780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34790 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
347a0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
347b0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
347c0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
347d0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
347e0 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
347f0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
34800 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
34810 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
34820 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
34830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34840 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
34850 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
34860 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
34870 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
34880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
34890 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
348a0 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
348b0 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
348c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
348d0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
348e0 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
348f0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
34900 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
34910 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
34920 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
34930 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
34940 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
34950 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
34960 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
34970 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
34980 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
34990 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
349a0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
349b0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
349c0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
349d0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
349e0 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61  s the lowest sca
349f0 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20  n cost..        
34a00 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
34a10 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
34a20 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
34a30 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
34a40 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
34a50 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
34a60 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f  013-10-03) Do no
34a70 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72  t count the entr
34a80 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c  ies in a partial
34a90 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
34aa0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
34ab0 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
34ac0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
34ad0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
34ae0 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
34af0 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
34b00 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
34b10 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
34b20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
34b30 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
34b40 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69  ) ) pBest = sqli
34b50 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
34b60 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
34b70 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
34b80 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
34b90 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
34ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
34bb0 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
34bc0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
34bd0 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  & pIdx->szIdxRow
34be0 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a  <pTab->szTabRow.
34bf0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
34c00 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
34c10 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
34c20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49  && (!pBest || pI
34c30 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65  dx->szIdxRow<pBe
34c40 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20  st->szIdxRow).  
34c50 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
34c60 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
34c70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Idx;.          }
34c80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34c90 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a     if( pBest ){.
34ca0 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20            iRoot 
34cb0 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20  = pBest->tnum;. 
34cc0 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
34cd0 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
34ce0 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
34cf0 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
34d00 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
34d10 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
34d20 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
34d30 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
34d40 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
34d50 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
34d60 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
34d70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
34d80 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44   iCsr, iRoot, iD
34d90 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 1);.        i
34da0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
34db0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
34dc0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
34dd0 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  -1, (char *)pKey
34de0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
34df0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34e10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
34e20 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e  nt, iCsr, sAggIn
34e30 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d  fo.aFunc[0].iMem
34e40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34e50 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
34e60 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b  OP_Close, iCsr);
34e70 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
34e80 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72  SimpleCount(pPar
34e90 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29  se, pTab, pBest)
34ea0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
34eb0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
34ec0 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
34ed0 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
34ee0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
34ef0 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e  e query is of on
34f00 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
34f10 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20  ng forms:.      
34f20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
34f30 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20    SELECT min(x) 
34f40 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
34f50 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
34f60 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
34f70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
34f80 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
34f90 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
34fa0 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
34fb0 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
34fc0 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ults.        ** 
34fd0 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  as if there was 
34fe0 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20  an "ORDER ON x" 
34ff0 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44  or "ORDER ON x D
35000 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20  ESC" clause. .  
35010 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72        ** If wher
35020 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70  e.c is able to p
35030 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73  roduce results s
35040 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72  orted in this or
35050 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  der, then.      
35060 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f    ** add vdbe co
35070 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  de to break out 
35080 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
35090 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65  g loop after the
350a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72   .        ** fir
350b0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
350c0 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
350d0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
350e0 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20  oop is .        
350f0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
35100 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
35110 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e  row with the min
35120 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20  imum or maximum 
35130 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
35140 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
35150 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
35160 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
35170 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
35180 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
35190 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
351a0 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
351b0 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a  ightly.        *
351c0 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f  * modify behavio
351d0 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  r as follows:.  
351e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
351f0 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71   **   + If the q
35200 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43  uery is a "SELEC
35210 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20  T min(x)", then 
35220 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62  the loop coded b
35230 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  y.        **    
35240 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20   where.c should 
35250 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72  not iterate over
35260 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68   any values with
35270 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20   a NULL value.  
35280 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72        **     for
35290 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20   x..        **. 
352a0 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68         **   + Th
352b0 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65  e optimizer code
352c0 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65   in where.c (the
352d0 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69   thing that deci
352e0 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  des which.      
352f0 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f    **     index o
35300 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65  r indices to use
35310 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61  ) should place a
35320 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72   different prior
35330 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20  ity on .        
35340 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e  **     satisfyin
35350 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27  g the 'ORDER BY'
35360 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20   clause than it 
35370 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61  does in other ca
35380 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ses..        ** 
35390 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64      Refer to cod
353a0 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69  e and comments i
353b0 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65  n where.c for de
353c0 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  tails..        *
353d0 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
353e0 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b  st *pMinMax = 0;
353f0 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67  .        u8 flag
35400 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
35410 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20  _NORMAL;.       
35420 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
35430 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
35440 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
35450 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20  rt( flag==0 );. 
35460 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48         if( p->pH
35470 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20  aving==0 ){.    
35480 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e        flag = min
35490 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e  MaxQuery(&sAggIn
354a0 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20  fo, &pMinMax);. 
354b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
354c0 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
354d0 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20   || (pMinMax!=0 
354e0 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  && pMinMax->nExp
354f0 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20  r==1) );..      
35500 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20    if( flag ){.  
35510 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20          pMinMax 
35520 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
35530 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78  tDup(db, pMinMax
35540 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
35550 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a  pDel = pMinMax;.
35560 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
35570 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
35580 65 64 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d 30  ed || pMinMax!=0
35590 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
355a0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
355b0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
355c0 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
355d0 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
355e0 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
355f0 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
35600 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
35610 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
35620 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
35630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35640 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
35650 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
35660 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
35670 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
35680 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
35690 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
356a0 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
356b0 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
356c0 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
356d0 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
356e0 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
356f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
35700 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
35710 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
35720 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
35730 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
35740 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
35750 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
35760 4d 69 6e 4d 61 78 2c 20 30 2c 66 6c 61 67 2c 30  MinMax, 0,flag,0
35770 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
35780 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
35790 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
357a0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
357b0 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pDel);.         
357c0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
357d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
357e0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
357f0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
35800 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
35810 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61    assert( pMinMa
35820 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d  x==0 || pMinMax-
35830 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
35840 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
35850 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
35860 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20  WInfo)>0 ){.    
35870 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35880 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33  eGoto(v, sqlite3
35890 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
358a0 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  pWInfo));.      
358b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
358c0 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
358d0 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
358e0 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52       (flag==WHER
358f0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
35900 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
35910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35920 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
35930 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
35940 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
35950 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
35960 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
35970 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  }..      sSort.p
35980 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
35990 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
359a0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
359b0 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
359c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
359d0 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  L);.      select
359e0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
359f0 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a  , p, -1, 0, 0, .
35a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a10 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
35a20 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
35a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
35a40 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
35a50 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
35a60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
35a70 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
35a80 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
35a90 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
35aa0 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
35ab0 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63  ( sDistinct.eTnc
35ac0 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
35ad0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
35ae0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
35af0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
35b00 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d  "DISTINCT");.  }
35b10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
35b20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
35b30 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
35b40 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
35b50 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
35b60 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
35b70 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
35b80 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
35b90 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
35ba0 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
35bb0 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
35bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35bd0 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
35be0 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41  at>0 ? "RIGHT PA
35bf0 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a  RT OF ORDER BY":
35c00 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20  "ORDER BY");.   
35c10 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
35c20 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53  l(pParse, p, &sS
35c30 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ort, pEList->nEx
35c40 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a  pr, pDest);.  }.
35c50 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
35c60 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65  to skip this que
35c70 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
35c80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
35c90 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  l(v, iEnd);..  /
35ca0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73  * The SELECT has
35cb0 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20   been coded. If 
35cc0 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f  there is an erro
35cd0 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73  r in the Parse s
35ce0 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73  tructure,.  ** s
35cf0 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
35d00 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69  de to 1. Otherwi
35d10 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  se 0. */.  rc = 
35d20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29  (pParse->nErr>0)
35d30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
35d40 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
35d50 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
35d60 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
35d70 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
35d80 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
35d90 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
35da0 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
35db0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
35dc0 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
35dd0 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
35de0 6c 65 63 74 49 64 29 3b 0a 0a 20 20 73 71 6c 69  lectId);..  sqli
35df0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
35e00 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
35e10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
35e20 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
35e30 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
35e40 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c  CE_ENABLED.  SEL
35e50 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
35e60 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73  e,p,("end proces
35e70 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61  sing\n"));.  pPa
35e80 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
35e90 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72  nt--;.#endif.  r
35ea0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.