/ Hex Artifact Content
Login

Artifact 4f0adefaa5e9417459b07757e0f6060cac97930a86f0fba9797bab233ced66c0:


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 46 69 65 6c 64  , 0, pKI->nField
4dd0: 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a  ); /* Makes OP_J
4de0: 75 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62  ump below testab
4df0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
4e00: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4e10: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c   -1, (char*)pKI,
4e20: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
4e30: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d    testcase( pKI-
4e40: 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a 20 20  >nXField>2 );.  
4e50: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
4e60: 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
4e70: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4e80: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4e90: 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20  , nOBSat,.      
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69 65 6c       pKI->nXFiel
4ed0: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
4ee0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
4ef0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
4f00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f10: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
4f20: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
4f30: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
4f40: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4f50: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
4f60: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
4f70: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
4f80: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4f90: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
4fa0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
4fb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4fc0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
4fd0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
4fe0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
4ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5000: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
5010: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
5020: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
5030: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
5040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5050: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
5060: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
5070: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
5080: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5090: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
50a0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
50b0: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
50c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50d0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
50e0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
50f0: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
5100: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5110: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5120: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
5130: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
5140: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5150: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
5160: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
5170: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
5180: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
5190: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
51a0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
51b0: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
51c0: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
51d0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
51e0: 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73            regBas
51f0: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
5200: 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69  nOBSat);.  if( i
5210: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
5220: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72   addr;.    int r
5230: 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69  1 = 0;.    /* Fi
5240: 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e  ll the sorter un
5250: 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  til it contains 
5260: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74  LIMIT+OFFSET ent
5270: 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d  ries.  (The iLim
5280: 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  it.    ** regist
5290: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
52a0: 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20  d with value of 
52b0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20  LIMIT+OFFSET.)  
52c0: 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72  After the sorter
52d0: 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70  .    ** fills up
52e0: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61  , delete the lea
52f0: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
5300: 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63  sorter after eac
5310: 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a  h insert..    **
5320: 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68   Thus we never h
5330: 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  old more than th
5340: 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72  e LIMIT+OFFSET r
5350: 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74  ows in memory at
5360: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64   once */.    add
5370: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
5380: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
5390: 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20  tZero, iLimit); 
53a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
53b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
53c0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
53d0: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
53e0: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
53f0: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5400: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5410: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
5420: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
5430: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5440: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
5450: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
5460: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
5470: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
5480: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
5490: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
54a0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
54b0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
54c0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
54d0: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
54e0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
54f0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5500: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5510: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
5520: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
5530: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
5540: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
5550: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
5560: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
5570: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
5580: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
5590: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
55a0: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
55b0: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
55c0: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
55d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
55e0: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
55f0: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5600: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5610: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
5620: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
5630: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
5640: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5650: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
5660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5670: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5680: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
5690: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
56a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
56b0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
56c0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
56d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
56e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
56f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5700: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
5710: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
5720: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
5730: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
5740: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
5750: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
5760: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5770: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5780: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
5790: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
57a0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
57b0: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
57c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
57d0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
57e0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
57f0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5800: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5810: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
5820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5830: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
5840: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
5850: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
5860: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
5870: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
5880: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5890: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
58a0: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
58b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
58c0: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
58d0: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
58e0: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
58f0: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5900: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5910: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
5920: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
5930: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
5940: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
5950: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
5960: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
5970: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
5980: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
5990: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
59a0: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
59b0: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
59c0: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
59d0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
59e0: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
59f0: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
5a00: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
5a10: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
5a20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5a30: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
5a40: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5a50: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
5a60: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
5a70: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
5a80: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
5a90: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
5aa0: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
5ab0: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
5ac0: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
5ad0: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
5ae0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
5af0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5b00: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
5b10: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
5b20: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
5b30: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
5b40: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
5b50: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
5b60: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
5b70: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5b80: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5ba0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
5bb0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
5bc0: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
5bd0: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
5be0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5bf0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5c00: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
5c10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5c20: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
5c30: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20  sert, iTab, r1, 
5c40: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
5c50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5c60: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
5c70: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
5c80: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5c90: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
5ca0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5cb0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5cc0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5cd0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5ce0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5cf0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5d00: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
5d10: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
5d20: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
5d30: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
5d40: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
5d50: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
5d60: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72  this row.  If sr
5d70: 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20  cTab is.** zero 
5d80: 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61  or more, then da
5d90: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
5da0: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
5db0: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
5dc0: 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20   .** to get the 
5dd0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
5de0: 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74  s and the collat
5df0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
5e00: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
5e10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
5e20: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
5e30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5e40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5e50: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5e60: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
5e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5e80: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
5e90: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
5ea0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
5eb0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
5ec0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5ed0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
5ee0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
5ef0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5f00: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5f10: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5f20: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5f30: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5f40: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5f50: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5f60: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5f70: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5f80: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5f90: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5fa0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5fb0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5fc0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
5fd0: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
5fe0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
5ff0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
6000: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
6010: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
6020: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
6030: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
6040: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
6050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
6060: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
6070: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
6080: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
6090: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
60a0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
60b0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
60c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
60d0: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
60e0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
60f0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6100: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6110: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
6120: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
6130: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6140: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6150: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
6160: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
6170: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
6180: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
6190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
61a0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
61b0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
61c0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
61d0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
61e0: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
61f0: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
6200: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 2f  egResult */..  /
6210: 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65  * Usually, regRe
6220: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
6230: 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  t cell in an arr
6240: 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  ay of memory cel
6250: 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  ls.  ** containi
6260: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ng the current r
6270: 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68  esult row. In th
6280: 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67 20  is case regOrig 
6290: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
62a0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48  ** same value. H
62b0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 72  owever, if the r
62c0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
62d0: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72   sent to the sor
62e0: 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61  ter, the.  ** va
62f0: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70  lues for any exp
6300: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
6310: 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74  e also part of t
6320: 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20  he sort-key are 
6330: 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f  omitted.  ** fro
6340: 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e  m this array. In
6350: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
6360: 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ig is set to zer
6370: 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  o.  */.  int reg
6380: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
6390: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
63a0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
63b0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20  current results 
63c0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
63d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
63e0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
63f0: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c  ory holding full
6400: 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a   result (or 0) *
6410: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
6420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
6430: 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69  st!=0 );.  hasDi
6440: 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e  stinct = pDistin
6450: 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e  ct ? pDistinct->
6460: 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52  eTnctType : WHER
6470: 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
6480: 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20  .  if( pSort && 
6490: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d  pSort->pOrderBy=
64a0: 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a  =0 ) pSort = 0;.
64b0: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26    if( pSort==0 &
64c0: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
64d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  {.    assert( iC
64e0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
64f0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6500: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
6510: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tinue);.  }..  /
6520: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
6530: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
6540: 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  */.  nResultCol 
6550: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
6560: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
6570: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
6580: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
6590: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
65a0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
65b0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
65c0: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
65d0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
65e0: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
65f0: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
6600: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6610: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
6620: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
6630: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
6640: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
6650: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
6660: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
6670: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
6680: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
6690: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
66a0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
66b0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
66c0: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
66d0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
66e0: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
66f0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
6700: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
6710: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
6720: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
6730: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
6740: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
6750: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
6760: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
6770: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
6780: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
6790: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
67a0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
67b0: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
67c0: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
67d0: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
67e0: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
67f0: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
6800: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
6810: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6820: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
6830: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
6840: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
6850: 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73  regOrig = regRes
6860: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  ult = pDest->iSd
6870: 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62  st;.  if( srcTab
6880: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
6890: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
68a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
68b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
68c0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
68d0: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
68e0: 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  lt+i);.      Vdb
68f0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
6900: 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ", pEList->a[i].
6910: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
6920: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6930: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
6940: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
6950: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
6960: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
6970: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
6980: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
6990: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
69a0: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
69b0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
69c0: 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67  .    u8 ecelFlag
69d0: 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  s;.    if( eDest
69e0: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
69f0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6a00: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6a10: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6a20: 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49  ecelFlags = SQLI
6a30: 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20  TE_ECEL_DUP;.   
6a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63   }else{.      ec
6a50: 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  elFlags = 0;.   
6a60: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
6a70: 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d   && hasDistinct=
6a80: 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  =0 && eDest!=SRT
6a90: 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65  _EphemTab && eDe
6aa0: 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  st!=SRT_Table ){
6ab0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61  .      /* For ea
6ac0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
6ad0: 20 70 45 4c 69 73 74 20 74 68 61 74 20 69 73 20   pEList that is 
6ae0: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
6af0: 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20  ression in.     
6b00: 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
6b10: 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d 3e   clause (pSort->
6b20: 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20 74  pOrderBy), set t
6b30: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20  he associated . 
6b40: 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42 79       ** iOrderBy
6b50: 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65  Col value to one
6b60: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 69   more than the i
6b70: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44 45  ndex of the ORDE
6b80: 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20 65  R BY .      ** e
6b90: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e  xpression within
6ba0: 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74 68   the sort-key th
6bb0: 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  at pushOntoSorte
6bc0: 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  r() will generat
6bd0: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  e..      ** This
6be0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 45 4c 69   allows the pELi
6bf0: 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f  st field to be o
6c00: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
6c10: 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20  sorted record,. 
6c20: 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73       ** saving s
6c30: 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63  pace and CPU cyc
6c40: 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65  les.  */.      e
6c50: 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c  celFlags |= (SQL
6c60: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
6c70: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
6c80: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  );.      for(i=p
6c90: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c  Sort->nOBSat; i<
6ca0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
6cb0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6cc0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
6cd0: 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53       if( (j = pS
6ce0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ort->pOrderBy->a
6cf0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
6d00: 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
6d10: 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d      pEList->a[j-
6d20: 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  1].u.x.iOrderByC
6d30: 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e  ol = i+1-pSort->
6d40: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20  nOBSat;.        
6d50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6d60: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
6d70: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
6d80: 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65  ==SRT_Set || eDe
6d90: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20  st==SRT_Mem .   
6da0: 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74          || eDest
6db0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6dc0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  || eDest==SRT_Ou
6dd0: 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20  tput );.    }.  
6de0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 73    nResultCol = s
6df0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
6e00: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70 45  prList(pParse,pE
6e10: 4c 69 73 74 2c 72 65 67 52 65 73 75 6c 74 2c 30  List,regResult,0
6e20: 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d  ,ecelFlags);.  }
6e30: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
6e40: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
6e50: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
6e60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6e70: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
6e80: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
6e90: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
6ea0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
6eb0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
6ec0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
6ed0: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
6ee0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74  inct ){.    swit
6ef0: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
6f00: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
6f10: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
6f20: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
6f30: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
6f40: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
6f50: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
6f60: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
6f70: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
6f80: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
6f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6fa0: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
6fb0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
6fc0: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
6fd0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
6fe0: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
6ff0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
7000: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7010: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
7020: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
7030: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
7040: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
7050: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
7060: 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20  esultCol;..     
7070: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
7080: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
7090: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
70a0: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
70b0: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
70c0: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
70d0: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
70e0: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
70f0: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
7100: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
7110: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
7120: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
7130: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
7140: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
7150: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
7160: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
7170: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
7180: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
7190: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
71a0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
71b0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
71c0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
71d0: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
71e0: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
71f0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
7200: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
7210: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
7220: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
7230: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
7240: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
7250: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
7260: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
7270: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
7280: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
7290: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20  ResultCol;.     
72a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
72b0: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
72c0: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
72d0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
72e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
72f0: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
7300: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
7310: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
7320: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
7330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7340: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
7350: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
7360: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
7370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
7380: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7390: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
73a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
73b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
73c0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
73d0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
73e0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
73f0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
7400: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
7410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7420: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7430: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
7440: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
7450: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
7460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7470: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
7480: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
7490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
74a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
74b0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
74c0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
74d0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
74e0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
74f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7500: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
7510: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
7520: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
7530: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7540: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7550: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
7560: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
7570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7580: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
7590: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
75a0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
75b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
75c0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
75d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
75e0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
75f0: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
7600: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
7610: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
7620: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
7630: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
7640: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
7650: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7670: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
7680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7690: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
76a0: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
76b0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
76c0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
76d0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
76e0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
76f0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
7700: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
7710: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
7720: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
7730: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
7740: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
7750: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
7760: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
7770: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
7780: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
7790: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
77a0: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
77b0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
77c0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
77d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
77e0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
77f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7800: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
7810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7820: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
7830: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7840: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
7850: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7860: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7870: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7880: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
7890: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
78a0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
78b0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
78c0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
78d0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
78e0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
78f0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
7900: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
7910: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
7920: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
7930: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
7940: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7950: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
7960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7970: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7980: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
7990: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
79a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
79b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
79c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
79d0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
79e0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
79f0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
7a00: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
7a10: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
7a20: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
7a30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7a40: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7a50: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7a60: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7a70: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
7a80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7a90: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7aa0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7ab0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ac0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7ad0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7ae0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
7af0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
7b00: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7b10: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
7b20: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7b30: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7b40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7b50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7b60: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7b70: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7b80: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7b90: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7ba0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7bb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7bc0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7bd0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7be0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
7bf0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
7c00: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
7c10: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
7c20: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
7c30: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
7c40: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7c50: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7c60: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7c70: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
7c80: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7c90: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7ca0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7cb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7cc0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7cd0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7ce0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7cf0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7d00: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7d10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7d20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
7d30: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7d40: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7d50: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7d60: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7d70: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
7d80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7d90: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7db0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7dc0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7dd0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
7de0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
7df0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7e00: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
7e10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
7e20: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7e30: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7e40: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7e50: 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78  t, p, r1+nPrefix
7e60: 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31 2c  Reg,regResult,1,
7e70: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7e80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7e90: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
7ea0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7eb0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
7ec0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ed0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7ee0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
7ef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f00: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7f10: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7f20: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7f30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7f40: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7f50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7f60: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7f70: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
7f80: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7f90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
7fa0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
7fb0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
7fc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7fd0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7fe0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
7ff0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
8000: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
8010: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
8020: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
8030: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
8040: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
8050: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
8060: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
8070: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
8080: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
8090: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
80a0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
80b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
80c0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Set: {.      if
80d0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
80e0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
80f0: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
8100: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
8110: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
8120: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
8130: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
8140: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
8150: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
8160: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
8170: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
8180: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
8190: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
81a0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
81b0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
81c0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
81d0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
81e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
81f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
8200: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8210: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
8220: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
8230: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
8240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8250: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
8260: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8270: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  se);.        ass
8280: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c  ert( sqlite3Strl
8290: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
82a0: 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f  Sdst)==nResultCo
82b0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
82c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
82d0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
82e0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
82f0: 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20  ultCol, .       
8300: 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
8310: 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c  zAffSdst, nResul
8320: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8330: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8340: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8350: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8360: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8380: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8390: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
83a0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
83b0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
83c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
83d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
83e0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
83f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8400: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8410: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
8420: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
8430: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
8440: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
8450: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
8460: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
8470: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8480: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8490: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
84a0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
84b0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
84c0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
84d0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
84e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
84f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8500: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
8510: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
8520: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
8530: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
8540: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
8550: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
8560: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
8570: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
8580: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
8590: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
85a0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
85b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
85c0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
85d0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
85e0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
85f0: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
8600: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
8610: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
8620: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
8630: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
8640: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
8650: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
8660: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
8670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8680: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
8690: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
86a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
86b0: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
86c0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
86d0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
86e0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
86f0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
8700: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
8710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8720: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
8730: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8740: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
8750: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
8760: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
8770: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
8780: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
8790: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
87a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
87b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
87c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
87d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
87e0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
87f0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8800: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
8810: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
8820: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
8830: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
8840: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
8850: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
8860: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
8890: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
88a0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
88b0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
88c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
88d0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
88e0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
88f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8910: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
8920: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
8930: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8950: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
8960: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
8970: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8980: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
8990: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
89a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
89b0: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
89c0: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
89d0: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
89e0: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
89f0: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
8a00: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
8a10: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
8a20: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
8a30: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
8a40: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
8a50: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
8a60: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
8a70: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
8a80: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
8a90: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
8aa0: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
8ab0: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
8ac0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
8ad0: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
8ae0: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
8af0: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
8b00: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
8b10: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
8b20: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
8b30: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
8b40: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
8b50: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
8b60: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
8b70: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
8b80: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
8b90: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
8ba0: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
8bb0: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
8bc0: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
8bd0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
8be0: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
8bf0: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
8c00: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
8c10: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
8c20: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8c30: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
8c40: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
8c50: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
8c60: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
8c70: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
8c80: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
8c90: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
8ca0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
8cb0: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
8cc0: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
8cd0: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
8ce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
8cf0: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
8d00: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
8d10: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
8d20: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
8d30: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
8d40: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
8d50: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
8d60: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
8d70: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
8d80: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
8d90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8da0: 20 20 20 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 72 65 67 52 65             regRe
8dc0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8dd0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
8de0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8df0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8e00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8e10: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
8e20: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8e30: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
8e40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
8e50: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
8e60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8e70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8e80: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
8e90: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
8ea0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8eb0: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
8ec0: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
8ed0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
8ee0: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
8ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8f00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8f10: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
8f40: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
8f50: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
8f80: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8f90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8fa0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
8fb0: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
8fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8fd0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8fe0: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
8ff0: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
9000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9010: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9020: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9030: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
9040: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
9050: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
9060: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
9070: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9080: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
9090: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
90a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
90b0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
90c0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
90d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
90e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
90f0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
9100: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
9110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
9120: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
9130: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
9140: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
9150: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
9160: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
9170: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
9180: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
9190: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
91a0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
91b0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
91c0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
91d0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
91e0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
91f0: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
9200: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
9210: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
9220: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
9230: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9240: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
9250: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
9260: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9270: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
9280: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
9290: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
92a0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
92b0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
92c0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
92d0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
92e0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
92f0: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
9300: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
9310: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
9320: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
9330: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
9340: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
9350: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9360: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
9370: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
9380: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
9390: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
93a0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
93b0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
93c0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
93d0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
93e0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
93f0: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
9400: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
9410: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
9420: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
9430: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
9440: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
9450: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
9460: 2b 31 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  +1);.  KeyInfo *
9470: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
9480: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
9490: 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 6e  eof(KeyInfo) + n
94a0: 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20  Extra);.  if( p 
94b0: 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  ){.    p->aSortO
94c0: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  rder = (u8*)&p->
94d0: 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20  aColl[N+X];.    
94e0: 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  p->nField = (u16
94f0: 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65  )N;.    p->nXFie
9500: 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20  ld = (u16)X;.   
9510: 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62   p->enc = ENC(db
9520: 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64  );.    p->db = d
9530: 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  b;.    p->nRef =
9540: 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   1;.    memset(&
9550: 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29  p[1], 0, nExtra)
9560: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
9570: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
9580: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
9590: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61   p;.}../*.** Dea
95a0: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
95b0: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64  o object.*/.void
95c0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
95d0: 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  nref(KeyInfo *p)
95e0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
95f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
9600: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
9610: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  f--;.    if( p->
9620: 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65  nRef==0 ) sqlite
9630: 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c  3DbFreeNN(p->db,
9640: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
9650: 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69  * Make a new poi
9660: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
9670: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49  o object.*/.KeyI
9680: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
9690: 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a  nfoRef(KeyInfo *
96a0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
96b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
96c0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
96d0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Ref++;.  }.  ret
96e0: 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn p;.}..#ifdef
96f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
9700: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
9710: 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  if a KeyInfo obj
9720: 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67  ect can be chang
9730: 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  e.  The KeyInfo 
9740: 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e  object.** can on
9750: 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66  ly be changed if
9760: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20   this is just a 
9770: 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65  single reference
9780: 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a   to the object..
9790: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
97a0: 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
97b0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
97c0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
97d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79  /.int sqlite3Key
97e0: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
97f0: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74  KeyInfo *p){ ret
9800: 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20  urn p->nRef==1; 
9810: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9820: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
9830: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
9840: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
9850: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
9860: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
9870: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
9880: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
9890: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
98a0: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
98b0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
98c0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
98d0: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
98e0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
98f0: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
9900: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
9910: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
9920: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
9930: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
9940: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
9950: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
9960: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
9970: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
9980: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
9990: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
99a0: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
99b0: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
99c0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
99d0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
99e0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
99f0: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
9a00: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
9a10: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
9a20: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
9a30: 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
9a40: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
9a50: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
9a60: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
9a70: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
9a80: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
9a90: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
9aa0: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
9ab0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
9ac0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
9ad0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
9ae0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
9af0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9b00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9b10: 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74  t,     /* Form t
9b20: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
9b30: 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72  t from this Expr
9b40: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  List */.  int iS
9b50: 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f  tart,          /
9b60: 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69  * Begin with thi
9b70: 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73  s column of pLis
9b80: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  t */.  int nExtr
9b90: 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  a           /* A
9ba0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74  dd this many ext
9bb0: 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  ra columns to th
9bc0: 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e end */.){.  in
9bd0: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
9be0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
9bf0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
9c00: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
9c10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9c20: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ->db;.  int i;..
9c30: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
9c40: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
9c50: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
9c60: 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d  Alloc(db, nExpr-
9c70: 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31  iStart, nExtra+1
9c80: 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29  );.  if( pInfo )
9c90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
9ca0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
9cb0: 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29  iteable(pInfo) )
9cc0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61  ;.    for(i=iSta
9cd0: 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  rt, pItem=pList-
9ce0: 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78  >a+iStart; i<nEx
9cf0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
9d00: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
9d10: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
9d20: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
9d30: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
9d40: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
9d50: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
9d60: 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
9d70: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
9d80: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d   pInfo->aColl[i-
9d90: 69 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b  iStart] = pColl;
9da0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53  .      pInfo->aS
9db0: 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72  ortOrder[i-iStar
9dc0: 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74  t] = pItem->sort
9dd0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
9de0: 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b  .  return pInfo;
9df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  .}../*.** Name o
9e00: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9e10: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
9e20: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
9e30: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
9e40: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
9e50: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
9e60: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
9e70: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
9e80: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
9e90: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
9ea0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9eb0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
9ec0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
9ed0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
9ee0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
9ef0: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
9f00: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9f10: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
9f20: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
9f30: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9f40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
9f50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9f60: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
9f70: 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45  .** Unless an "E
9f80: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
9f90: 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65  N" command is be
9fa0: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74  ing processed, t
9fb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
9fc0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
9fd0: 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61  rwise, it adds a
9fe0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
9ff0: 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50  utput to the EQP
a000: 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72   result,.** wher
a010: 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73  e the caption is
a020: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
a030: 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20  .**   "USE TEMP 
a040: 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a  B-TREE FOR xxx".
a050: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20  **.** where xxx 
a060: 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49  is one of "DISTI
a070: 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22  NCT", "ORDER BY"
a080: 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20   or "GROUP BY". 
a090: 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a  Exactly which.**
a0a0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
a0b0: 79 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67  y the zUsage arg
a0c0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
a0d0: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d   void explainTem
a0e0: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
a0f0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
a100: 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28   *zUsage){.  if(
a110: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
a120: 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==2 ){.    Vdbe 
a130: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a140: 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  be;.    char *zM
a150: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
a160: 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
a170: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
a180: 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65   FOR %s", zUsage
a190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a1a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a1b0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a1c0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a1d0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a1e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
a1f0: 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69   Assign expressi
a200: 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61  on b to lvalue a
a210: 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f  . A second, no-o
a220: 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  p, version of th
a230: 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70  is macro.** is p
a240: 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c  rovided when SQL
a250: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a260: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69   is defined. Thi
a270: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64  s allows the cod
a280: 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53  e.** in sqlite3S
a290: 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67  elect() to assig
a2a0: 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75  n values to stru
a2b0: 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72  cture member var
a2c0: 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f  iables that.** o
a2d0: 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c  nly exist if SQL
a2e0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a2f0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
a300: 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e  without pollutin
a310: 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  g the.** code wi
a320: 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63  th #ifndef direc
a330: 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69  tives..*/.# defi
a340: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
a350: 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62  eger(a, b) a = b
a360: 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  ..#else./* No-op
a370: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
a380: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
a390: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
a3a0: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
a3b0: 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
a3c0: 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65  (y,z).# define e
a3d0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
a3e0: 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69  (y,z).#endif..#i
a3f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a400: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
a410: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a420: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
a430: 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55  _SELECT)./*.** U
a440: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
a450: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
a460: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
a470: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
a480: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
a490: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
a4a0: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
a4b0: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
a4c0: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
a4d0: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
a4e0: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f   caption is of o
a4f0: 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f  ne of the two fo
a500: 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f  rms:.**.**   "CO
a510: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
a520: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
a530: 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43  b2 (op)".**   "C
a540: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
a550: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
a560: 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42  ub2 USING TEMP B
a570: 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a  -TREE (op)".**.*
a580: 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e  * where iSub1 an
a590: 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20  d iSub2 are the 
a5a0: 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20  integers passed 
a5b0: 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  as the correspon
a5c0: 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ding.** function
a5d0: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64   parameters, and
a5e0: 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20   op is the text 
a5f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
a600: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a  f the parameter.
a610: 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ** of the same n
a620: 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74  ame. The paramet
a630: 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20  er "op" must be 
a640: 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  one of TK_UNION,
a650: 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54   TK_EXCEPT,.** T
a660: 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54  K_INTERSECT or T
a670: 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74  K_ALL. The first
a680: 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66   form is used if
a690: 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d   argument bUseTm
a6a0: 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20  p is .** false, 
a6b0: 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f  or the second fo
a6c0: 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65  rm if it is true
a6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a6e0: 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
a6f0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
a700: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
a710: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
a720: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
a730: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
a740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
a750: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
a760: 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f  K_EXCEPT etc. */
a770: 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20  .  int iSub1,   
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69     /* Subquery i
a7a0: 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  d 1 */.  int iSu
a7b0: 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b2,             
a7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71           /* Subq
a7d0: 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69  uery id 2 */.  i
a7e0: 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20  nt bUseTmp      
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a800: 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70  * True if a temp
a810: 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20   table was used 
a820: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
a830: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20  op==TK_UNION || 
a840: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
a850: 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
a860: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  T || op==TK_ALL 
a870: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
a880: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
a890: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
a8a0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
a8b0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
a8c0: 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20  ite3MPrintf(.   
a8d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c       pParse->db,
a8e0: 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55   "COMPOUND SUBQU
a8f0: 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20  ERIES %d AND %d 
a900: 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20  %s(%s)", iSub1, 
a910: 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62  iSub2,.        b
a920: 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45  UseTmp?"USING TE
a930: 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20  MP B-TREE ":"", 
a940: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29  selectOpName(op)
a950: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
a960: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
a970: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
a980: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
a990: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
a9a0: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  YNAMIC);.  }.}.#
a9b0: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
a9c0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
a9d0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
a9e0: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
a9f0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
aa00: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c  lainComposite(v,
aa10: 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  w,x,y,z).#endif.
aa20: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
aa30: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
aa40: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
aa50: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
aa60: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
aa70: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
aa80: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
aa90: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
aaa0: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
aab0: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
aac0: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
aad0: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
aae0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
aaf0: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
ab00: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
ab10: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
ab20: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
ab30: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
ab40: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
ab50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ab60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ab70: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
ab80: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
ab90: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
aba0: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
abb0: 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f  pSort,   /* Info
abc0: 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f  rmation on the O
abd0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
abe0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
abf0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ac00: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
ac10: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
ac20: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
ac30: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
ac40: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
ac50: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
ac60: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
ac90: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
aca0: 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70  nt addrBreak = p
acb0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b  Sort->labelDone;
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
acd0: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74  ump here to exit
ace0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
acf0: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
ad00: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ad10: 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20  el(v);  /* Jump 
ad20: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79  here for next cy
ad30: 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  cle */.  int add
ad40: 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63  r;.  int addrOnc
ad50: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  e = 0;.  int iTa
ad60: 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  b;.  ExprList *p
ad70: 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d  OrderBy = pSort-
ad80: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
ad90: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
ada0: 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61  eDest;.  int iPa
adb0: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
adc0: 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  arm;.  int regRo
add0: 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  w;.  int regRowi
ade0: 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  d;.  int iCol;. 
adf0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
ae00: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae20: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
ae30: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
ae40: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
ae70: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
ae80: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
ae90: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
aec0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
aed0: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
aee0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
aef0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45  List_item *aOutE
af00: 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  x = p->pEList->a
af10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  ;..  assert( add
af20: 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66  rBreak<0 );.  if
af30: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
af40: 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
af50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
af60: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
af70: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
af80: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
af90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
afa0: 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b  oto(v, addrBreak
afb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
afc0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
afd0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
afe0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62  Out);.  }.  iTab
aff0: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
b000: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
b010: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
b020: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b030: 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ine || eDest==SR
b040: 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 67  T_Mem ){.    reg
b050: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72  Rowid = 0;.    r
b060: 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69  egRow = pDest->i
b070: 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44  Sdst;.    nSortD
b080: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
b090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52   }else{.    regR
b0a0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
b0b0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
b0c0: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73  ;.    regRow = s
b0d0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
b0e0: 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75  ge(pParse, nColu
b0f0: 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61  mn);.    nSortDa
b100: 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ta = nColumn;.  
b110: 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65  }.  nKey = pOrde
b120: 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  rBy->nExpr - pSo
b130: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66  rt->nOBSat;.  if
b140: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
b150: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
b160: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
b170: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
b180: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
b190: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70      iSortTab = p
b1a0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
b1b0: 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61     if( pSort->la
b1c0: 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20  belBkOut ){.    
b1d0: 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
b1e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
b1f0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
b200: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b210: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
b220: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
b230: 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74  penPseudo, iSort
b240: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
b250: 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74   nKey+1+nSortDat
b260: 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  a);.    if( addr
b270: 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  Once ) sqlite3Vd
b280: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b290: 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64  drOnce);.    add
b2a0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
b2b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b2c0: 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62  SorterSort, iTab
b2d0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
b2e0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b2f0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
b300: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
b310: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
b320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b330: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
b340: 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65  erData, iTab, re
b350: 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54  gSortOut, iSortT
b360: 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  ab);.    bSeq = 
b370: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
b380: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
b390: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b3a0: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
b3b0: 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
b3c0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b3d0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
b3e0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
b3f0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f  ntinue);.    iSo
b400: 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  rtTab = iTab;.  
b410: 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a    bSeq = 1;.  }.
b420: 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d    for(i=0, iCol=
b430: 6e 4b 65 79 2b 62 53 65 71 3b 20 69 3c 6e 53 6f  nKey+bSeq; i<nSo
b440: 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20  rtData; i++){.  
b450: 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 20    int iRead;.   
b460: 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75   if( aOutEx[i].u
b470: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29  .x.iOrderByCol )
b480: 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d 20  {.      iRead = 
b490: 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f  aOutEx[i].u.x.iO
b4a0: 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20 20  rderByCol-1;.   
b4b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
b4c0: 65 61 64 20 3d 20 69 43 6f 6c 2b 2b 3b 0a 20 20  ead = iCol++;.  
b4d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
b4e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b4f0: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
b500: 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77 2b  , iRead, regRow+
b510: 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  i);.    VdbeComm
b520: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f  ent((v, "%s", aO
b530: 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20  utEx[i].zName ? 
b540: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
b550: 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61  : aOutEx[i].zSpa
b560: 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n));.  }.  switc
b570: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
b580: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
b590: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
b5a0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
b5b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b5c0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
b5d0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
b5e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b5f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b600: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
b610: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
b620: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b630: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b640: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
b650: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b660: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
b670: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
b680: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
b690: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b6a0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74  ( nColumn==sqlit
b6b0: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74  e3Strlen30(pDest
b6c0: 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a 20  ->zAffSdst) );. 
b6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b6e0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
b6f0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
b700: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77   nColumn, regRow
b710: 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  id,.            
b720: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
b730: 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f  t->zAffSdst, nCo
b740: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
b750: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
b760: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
b770: 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  se, regRow, nCol
b780: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
b790: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
b7a0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
b7b0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
b7c0: 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  d, regRow, nColu
b7d0: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
b7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b7f0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
b800: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
b810: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
b820: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
b830: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
b840: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
b850: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
b860: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
b870: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b880: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
b890: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
b8a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
b8b0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
b8c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b8d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
b8e0: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
b8f0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
b900: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
b910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b920: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
b930: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
b940: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
b950: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b960: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
b970: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
b980: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
b990: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b9a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b9b0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b9c0: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
b9d0: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
b9e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b9f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
ba00: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
ba10: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20   eDest==SRT_Set 
ba20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ba30: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
ba40: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
ba50: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d   nColumn);.    }
ba60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
ba70: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ba80: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
ba90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
baa0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
bab0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
bac0: 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  wid);.  }.  /* T
bad0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
bae0: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
baf0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
bb00: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
bb10: 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f  inue);.  if( pSo
bb20: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
bb30: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
bb40: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
bb50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bb60: 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54  P_SorterNext, iT
bb70: 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43  ab, addr); VdbeC
bb80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65  overage(v);.  }e
bb90: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
bba0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bbb0: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
bbc0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
bbd0: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (v);.  }.  if( p
bbe0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
bbf0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
bc00: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
bc10: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
bc20: 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rn);.  sqlite3Vd
bc30: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
bc40: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a  , addrBreak);.}.
bc50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
bc60: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
bc70: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
bc80: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
bc90: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
bca0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
bcb0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
bcc0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
bcd0: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
bce0: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ler..**.** Also 
bcf0: 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
bd00: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
bd10: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61  returned value a
bd20: 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a  nd return that.*
bd30: 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73  * result in *pEs
bd40: 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  tWidth..**.** Th
bd50: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
bd60: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
bd70: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
bd80: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
bd90: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
bda0: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
bdb0: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
bdc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
bdd0: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
bde0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
bdf0: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
be00: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
be10: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
be20: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
be30: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
be40: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
be50: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
be60: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
be70: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
be80: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
be90: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
bea0: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
beb0: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
bec0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
bed0: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
bee0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
bef0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
bf00: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
bf10: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
bf20: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
bf30: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
bf40: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
bf50: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
bf60: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
bf70: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
bf80: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
bf90: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
bfa0: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
bfb0: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
bfc0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
bfd0: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69  s routine has ei
bfe0: 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72 61  ther 3 or 6 para
bff0: 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67  meters depending
c000: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
c010: 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ot.** the SQLITE
c020: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c030: 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d  ETADATA compile-
c040: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75  time option is u
c050: 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
c060: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c070: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64  UMN_METADATA.# d
c080: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
c090: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
c0a0: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
c0b0: 2c 43 2c 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20  ,C,D,E,F).#else 
c0c0: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
c0d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c0e0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
c0f0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
c100: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
c110: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
c120: 28 41 2c 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73  (A,B,F).#endif.s
c130: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c140: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
c150: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
c160: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
c170: 45 78 70 72 2c 0a 23 69 66 64 65 66 20 53 51 4c  Expr,.#ifdef SQL
c180: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
c190: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 6f 6e  N_METADATA.  con
c1a0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
c1b0: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
c1c0: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
c1d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
c1e0: 72 69 67 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20  rigCol,.#endif. 
c1f0: 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29   u8 *pEstWidth.)
c200: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
c210: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
c220: 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74   j;.  u8 estWidt
c230: 68 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  h = 1;.#ifdef SQ
c240: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c250: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68  MN_METADATA.  ch
c260: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
c270: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
c280: 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  nst *zOrigTab = 
c290: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
c2a0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
c2b0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
c2c0: 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61   pExpr!=0 );.  a
c2d0: 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
c2e0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 77 69  List!=0 );.  swi
c2f0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
c300: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
c310: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
c320: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
c330: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c340: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
c350: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
c360: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
c370: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
c380: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
c390: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
c3a0: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
c3b0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
c3c0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
c3d0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
c3e0: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
c3f0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
c400: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
c410: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
c420: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
c430: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c440: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
c450: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
c460: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
c470: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
c480: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
c490: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
c4a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
c4b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
c4c0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
c4d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c4e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
c4f0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
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 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
c520: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
c530: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
c540: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
c550: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
c560: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
c570: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
c580: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
c590: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
c5a0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
c5b0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
c5c0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
c5d0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
c5e0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
c5f0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
c600: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
c610: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
c620: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
c630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c640: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
c650: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
c660: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
c670: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
c680: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
c690: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
c6a0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
c6b0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
c6c0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
c6d0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
c6e0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
c6f0: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
c700: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
c710: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
c720: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
c730: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
c740: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
c750: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
c760: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
c770: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
c780: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
c790: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
c7a0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
c7b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
c7c0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c7d0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
c7e0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
c7f0: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
c800: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
c810: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
c820: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
c830: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
c840: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
c850: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
c860: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
c870: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
c880: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
c890: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
c8a0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
c8b0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
c8c0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
c8d0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
c8e0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
c8f0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
c900: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
c910: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
c920: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
c930: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
c940: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
c950: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
c960: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
c970: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
c980: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
c990: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
c9a0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
c9b0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
c9c0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
c9d0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
c9e0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
c9f0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
ca00: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ca10: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
ca20: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
ca30: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
ca40: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
ca50: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
ca60: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
ca70: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
ca80: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
ca90: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
caa0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
cab0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
cac0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
cad0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
cae0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
caf0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
cb00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
cb10: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
cb20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
cb30: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57  ( iCol>=0 && ALW
cb40: 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c  AYS(iCol<pS->pEL
cb50: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
cb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
cb70: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
cb80: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
cb90: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
cba0: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
cbb0: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
cbc0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
cbd0: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
cbe0: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
cbf0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
cc00: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
cc10: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
cc20: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
cc30: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
cc40: 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
cc50: 54 68 65 20 41 4c 57 41 59 53 28 29 20 69 73 20  The ALWAYS() is 
cc60: 62 65 63 61 75 73 65 20 69 43 6f 6c 3e 3d 70 53  because iCol>=pS
cc70: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
cc80: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 20  will have been. 
cc90: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 67           ** caug
cca0: 68 74 20 61 6c 72 65 61 64 79 20 62 79 20 6e 61  ht already by na
ccb0: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20  me resolution.. 
ccc0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
ccd0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
cce0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
ccf0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
cd00: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
cd10: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
cd20: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
cd30: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
cd40: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
cd50: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  NC;.          sN
cd60: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
cd70: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
cd80: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
cd90: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f  Type(&sNC, p,&zO
cda0: 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c  rigDb,&zOrigTab,
cdb0: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
cdc0: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20  idth); .        
cdd0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
cde0: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
cdf0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
ce00: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
ce10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
ce20: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
ce30: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
ce40: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
ce50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
ce60: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
ce70: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
ce80: 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66  >nCol) );.#ifdef
ce90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
cea0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
ceb0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
cec0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
ced0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
cee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
cef0: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
cf00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cf10: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
cf20: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
cf30: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
cf40: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
cf50: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
cf60: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
cf70: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ],0);.          
cf80: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
cf90: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
cfa0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
cfb0: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
cfc0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
cfd0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
cfe0: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
cff0: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
d000: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
d010: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
d020: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
d030: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
d040: 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  gDb = pNC->pPars
d050: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
d060: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zDbSName;.      
d070: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
d080: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
d090: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
d0a0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
d0b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d0c0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
d0d0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
d0e0: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
d0f0: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ],0);.          
d100: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
d110: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
d120: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
d130: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
d140: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
d150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d160: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
d170: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
d180: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
d190: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
d1a0: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
d1b0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
d1c0: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
d1d0: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
d1e0: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
d1f0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
d200: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
d210: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
d220: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
d230: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
d240: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
d250: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
d260: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
d270: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
d280: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
d290: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
d2a0: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
d2b0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
d2c0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
d2d0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
d2e0: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
d2f0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
d300: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
d310: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
d320: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
d330: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
d340: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
d350: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
d360: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
d370: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
d380: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
d390: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d3a0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
d3b0: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
d3c0: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
d3d0: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
d3e0: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
d3f0: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
d400: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
d410: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
d420: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
d430: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
d440: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
d450: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
d460: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
d470: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
d480: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
d490: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
d4a0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
d4b0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
d4c0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
d4d0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
d4e0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
d4f0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
d500: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
d510: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d520: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
d530: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
d540: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
d550: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
d560: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d570: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
d580: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
d590: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d5a0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
d5b0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
d5c0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
d5d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d5e0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
d5f0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
d600: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
d610: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
d620: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
d630: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
d640: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
d650: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d660: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
d670: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
d680: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d690: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
d6a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
d6b0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
d6c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
d6d0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
d6e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
d6f0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
d700: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
d710: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
d720: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
d730: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
d740: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
d750: 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  gCol, 0);..    /
d760: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
d770: 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70  make its own cop
d780: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
d790: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
d7a0: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
d7b0: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
d7c0: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
d7d0: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
d7e0: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
d7f0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
d800: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
d810: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
d820: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d830: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
d840: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c  SE, zOrigDb, SQL
d850: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d870: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d880: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
d890: 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f  OrigTab, SQLITE_
d8a0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d8b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d8c0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d8d0: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
d8e0: 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  gCol, SQLITE_TRA
d8f0: 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20  NSIENT);.#else. 
d900: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d910: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
d920: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
d930: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
d940: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d950: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
d960: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
d970: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d980: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
d990: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d9a0: 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d  T_DECLTYPE) */.}
d9b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d9c0: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 63 74  he Table objecct
d9d0: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
d9e0: 74 68 61 74 20 68 61 73 20 63 75 72 73 6f 72 20  that has cursor 
d9f0: 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 4f 72 20 72  iCursor..** Or r
da00: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
da10: 20 73 75 63 68 20 54 61 62 6c 65 20 6f 62 6a 65   such Table obje
da20: 63 74 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ct exists in the
da30: 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 73 74 61   SrcList..*/.sta
da40: 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62 6c 65  tic Table *table
da50: 57 69 74 68 43 75 72 73 6f 72 28 53 72 63 4c 69  WithCursor(SrcLi
da60: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69  st *pList, int i
da70: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 6a  Cursor){.  int j
da80: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  ;.  for(j=0; j<p
da90: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 29  List->nSrc; j++)
daa0: 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  {.    if( pList-
dab0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 69  >a[j].iCursor==i
dac0: 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
dad0: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  pList->a[j].pTab
dae0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
daf0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
db00: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
db10: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
db20: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
db30: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
db40: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
db50: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
db60: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
db70: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
db80: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
db90: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
dba0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
dbb0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
dbc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dbd0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
dbe0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
dbf0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
dc00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
dc10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
dc20: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
dc30: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
dc40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
dc50: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
dc60: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
dc70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c  .  int i;.  Tabl
dc80: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
dc90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
dca0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
dcb0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
dcc0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
dcd0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
dce0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
dcf0: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
dd00: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
dd10: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
dd20: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
dd30: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
dd40: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
dd50: 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e 6d  amesSet || db->m
dd60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
dd70: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
dd80: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
dd90: 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b  ( pTabList!=0 );
dda0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
ddb0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
ddc0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
ddd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
dde0: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
ddf0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
de00: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
de10: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
de20: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
de30: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
de40: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
de50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
de60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
de70: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
de80: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
de90: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
dea0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
deb0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
dec0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
ded0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
dee0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
def0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
df00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
df10: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
df20: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
df30: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
df40: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
df50: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
df60: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
df70: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
df80: 55 4d 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20  UMN).           
df90: 26 26 20 28 70 54 61 62 20 3d 20 74 61 62 6c 65  && (pTab = table
dfa0: 57 69 74 68 43 75 72 73 6f 72 28 70 54 61 62 4c  WithCursor(pTabL
dfb0: 69 73 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 29  ist, p->iTable))
dfc0: 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
dfd0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
dfe0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
dff0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
e000: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
e010: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
e020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
e030: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
e040: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
e050: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
e060: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
e070: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
e080: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
e090: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
e0a0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
e0b0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
e0c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
e0d0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
e0e0: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
e0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e100: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
e110: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
e120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e130: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c  DbStrDup(db, pEL
e140: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
e150: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e160: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e170: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  f( fullNames ){.
e180: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e190: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
e1a0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e1b0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
e1c0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
e1d0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
e1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
e1f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
e200: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
e210: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e220: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e240: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
e250: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
e260: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
e270: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
e280: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
e290: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e2a0: 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
e2b0: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
e2c0: 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
e2d0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
e2e0: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
e2f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e300: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
e310: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
e320: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
e330: 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
e340: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
e350: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
e360: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
e370: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
e380: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
e390: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
e3a0: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
e3b0: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
e3c0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
e3d0: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
e3e0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
e3f0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
e400: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
e410: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
e420: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
e430: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
e440: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
e450: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
e460: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
e470: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
e480: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
e490: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
e4a0: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
e4b0: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
e4c0: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
e4d0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
e4e0: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
e4f0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
e500: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
e510: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
e520: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
e530: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
e540: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
e550: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
e560: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
e570: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e  ITE_NOMEM..*/.in
e580: 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73  t sqlite3Columns
e590: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
e5a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e5b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e5c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e5d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e5e0: 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20  ,       /* Expr 
e5f0: 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20  list from which 
e600: 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e  to derive column
e610: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20   names */.  i16 
e620: 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *pnCol,         
e630: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e640: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
e650: 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c  ns here */.  Col
e660: 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20  umn **paCol     
e670: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
e680: 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73  e new column lis
e690: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  t here */.){.  s
e6a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e6b0: 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61  rse->db;   /* Da
e6c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e6d0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  n */.  int i, j;
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e700: 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74  ers */.  u32 cnt
e710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e720: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64       /* Index ad
e730: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
e740: 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  name unique */. 
e750: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a   Column *aCol, *
e760: 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  pCol;        /* 
e770: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
e780: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
e790: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
e7c0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
e7d0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
e7e0: 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
e7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
e800: 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e  ession for a sin
e810: 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  gle result colum
e820: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  n */.  char *zNa
e830: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
e840: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
e850: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
e860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e870: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61     /* Size of na
e880: 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f  me in zName[] */
e890: 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20  .  Hash ht;     
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e8b0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20  * Hash table of 
e8c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
e8d0: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
e8e0: 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70  it(&ht);.  if( p
e8f0: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
e900: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
e910: 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
e920: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
e930: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
e940: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
e950: 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
e960: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
e970: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
e980: 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
e990: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28   assert( nCol==(
e9a0: 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70  i16)nCol );.  *p
e9b0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
e9c0: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
e9d0: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
e9e0: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21  Col; i<nCol && !
e9f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ea00: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
ea10: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
ea20: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
ea30: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
ea40: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c    */.    p = sql
ea50: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
ea60: 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ate(pEList->a[i]
ea70: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
ea80: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
ea90: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
eaa0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
eab0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
eac0: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
ead0: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
eae0: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
eaf0: 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e */.    }else{.
eb00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
eb10: 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68  Expr = p;  /* Th
eb20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
eb30: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
eb40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
eb50: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
eb60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
eb70: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
eb80: 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69  th this expressi
eb90: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  on */.      whil
eba0: 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  e( pColExpr->op=
ebb0: 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
ebc0: 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43     pColExpr = pC
ebd0: 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  olExpr->pRight;.
ebe0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ebf0: 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20  pColExpr!=0 );. 
ec00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ec10: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
ec20: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 43 6f 6c  K_COLUMN && pCol
ec30: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 29 7b  Expr->pTab!=0 ){
ec40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
ec50: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
ec60: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
ec70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
ec80: 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
ec90: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
eca0: 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70    pTab = pColExp
ecb0: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
ecc0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
ecd0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
ece0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
ecf0: 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62  = iCol>=0 ? pTab
ed00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
ed10: 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20  me : "rowid";.  
ed20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
ed30: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  olExpr->op==TK_I
ed40: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  D ){.        ass
ed50: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
ed60: 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20  perty(pColExpr, 
ed70: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
ed80: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ed90: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
eda0: 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  en;.      }else{
edb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
edc0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
edd0: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
ede0: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
edf0: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
ee00: 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74    zName = pEList
ee10: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20  ->a[i].zSpan;.  
ee20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ee30: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
ee40: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
ee50: 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a   zName);..    /*
ee60: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
ee70: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
ee80: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
ee90: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
eea0: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
eeb0: 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68  an integer to th
eec0: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
eed0: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
eee0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74  ..    */.    cnt
eef0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
ef00: 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65   zName && sqlite
ef10: 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a  3HashFind(&ht, z
ef20: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
ef30: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
ef40: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
ef50: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d  ;.      if( nNam
ef60: 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  e>0 ){.        f
ef70: 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e  or(j=nName-1; j>
ef80: 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  0 && sqlite3Isdi
ef90: 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a  git(zName[j]); j
efa0: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
efb0: 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20  ( zName[j]==':' 
efc0: 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20  ) nName = j;.   
efd0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65     }.      zName
efe0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
eff0: 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c  f(db, "%.*z:%u",
f000: 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b   nName, zName, +
f010: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  +cnt);.      if(
f020: 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33   cnt>3 ) sqlite3
f030: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
f040: 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a  of(cnt), &cnt);.
f050: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
f060: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
f070: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
f080: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
f090: 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20  me(0, pCol);.   
f0a0: 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71   if( zName && sq
f0b0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
f0c0: 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c  &ht, zName, pCol
f0d0: 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20  )==pCol ){.     
f0e0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
f0f0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
f100: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
f110: 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64  ar(&ht);.  if( d
f120: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f130: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
f140: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
f150: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f160: 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b, aCol[j].zName
f170: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f180: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
f190: 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c  Col);.    *paCol
f1a0: 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c   = 0;.    *pnCol
f1b0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
f1c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
f1d0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
f1e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f1f0: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
f200: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
f210: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
f220: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
f230: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
f240: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
f250: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
f260: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
f270: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
f280: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
f290: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
f2a0: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
f2b0: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
f2c0: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
f2d0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
f2e0: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
f2f0: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
f300: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
f310: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
f320: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
f330: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
f340: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
f350: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
f360: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76  e resolved..*/.v
f370: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
f380: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
f390: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
f3a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f3b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
f3c0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62  ontexts */.  Tab
f3d0: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
f3e0: 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e     /* Add column
f3f0: 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f   type informatio
f400: 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  n to this table 
f410: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
f420: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
f430: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
f440: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
f450: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
f460: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
f470: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
f480: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
f490: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
f4a0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
f4b0: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
f4c0: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
f4d0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
f4e0: 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20  ;.  u64 szAll = 
f4f0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
f500: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73  elect!=0 );.  as
f510: 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e  sert( (pSelect->
f520: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
f530: 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20  solved)!=0 );.  
f540: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
f550: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
f560: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
f570: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f580: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
f590: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
f5a0: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
f5b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
f5c0: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
f5d0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
f5e0: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
f5f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
f600: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(i=0, pCol=pTa
f610: 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  b->aCol; i<pTab-
f620: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
f630: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
f640: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20  har *zType;.    
f650: 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20  int n, m;.    p 
f660: 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[i].pExpr;.  
f670: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
f680: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
f690: 20 30 2c 20 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a   0, 0, &pCol->sz
f6a0: 45 73 74 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20  Est);.    szAll 
f6b0: 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  += pCol->szEst;.
f6c0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
f6d0: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
f6e0: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
f6f0: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 28 6d   if( zType && (m
f700: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f710: 33 30 28 7a 54 79 70 65 29 29 3e 30 20 29 7b 0a  30(zType))>0 ){.
f720: 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
f730: 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e  3Strlen30(pCol->
f740: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43  zName);.      pC
f750: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ol->zName = sqli
f760: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
f770: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
f780: 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20  me, n+m+2);.    
f790: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d    if( pCol->zNam
f7a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e ){.        mem
f7b0: 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  cpy(&pCol->zName
f7c0: 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b  [n+1], zType, m+
f7d0: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  1);.        pCol
f7e0: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
f7f0: 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20  LFLAG_HASTYPE;. 
f800: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f810: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
f820: 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
f830: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
f840: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70  _AFF_BLOB;.    p
f850: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
f860: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
f870: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
f880: 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f  oll && pCol->zCo
f890: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ll==0 ){.      p
f8a0: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
f8b0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
f8c0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
f8d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
f8e0: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
f8f0: 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c  ite3LogEst(szAll
f900: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  *4);.}../*.** Gi
f910: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
f920: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
f930: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
f940: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
f950: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
f960: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
f970: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
f980: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
f990: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
f9a0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
f9b0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
f9c0: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
f9d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
f9e0: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
f9f0: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
fa00: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
fa10: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
fa20: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
fa30: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
fa40: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
fa50: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
fa60: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
fa70: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
fa80: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
fa90: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
faa0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
fab0: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
fac0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
fad0: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
fae0: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
faf0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
fb00: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
fb10: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
fb20: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
fb30: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
fb40: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
fb50: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
fb60: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
fb70: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
fb80: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
fb90: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
fba0: 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
fbb0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
fbc0: 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61  Disable );.  pTa
fbd0: 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
fbe0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
fbf0: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
fc00: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
fc10: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
fc20: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
fc30: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   );.  sqlite3Col
fc40: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
fc50: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
fc60: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
fc70: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
fc80: 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ol);.  sqlite3Se
fc90: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
fca0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
fcb0: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
fcc0: 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
fcd0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
fce0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fcf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
fd00: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
fd10: 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
fd20: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
fd30: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
fd40: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
fd50: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
fd60: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
fd70: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
fd80: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
fd90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
fda0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
fdb0: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
fdc0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74  in pParse..*/.st
fdd0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
fde0: 4c 49 4e 45 20 56 64 62 65 20 2a 61 6c 6c 6f 63  LINE Vdbe *alloc
fdf0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
fe00: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
fe10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
fe20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
fe30: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  te(pParse);.  if
fe40: 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62  ( v ) sqlite3Vdb
fe50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
fe60: 69 74 2c 20 30 2c 20 31 29 3b 0a 20 20 69 66 28  it, 0, 1);.  if(
fe70: 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
fe80: 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  el==0.   && Opti
fe90: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
fea0: 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
feb0: 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
fec0: 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ).  ){.    pPars
fed0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
fee0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
fef0: 72 6e 20 76 3b 0a 7d 0a 56 64 62 65 20 2a 73 71  rn v;.}.Vdbe *sq
ff00: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
ff10: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
ff20: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
ff30: 3e 70 56 64 62 65 3b 0a 20 20 72 65 74 75 72 6e  >pVdbe;.  return
ff40: 20 76 20 3f 20 76 20 3a 20 61 6c 6c 6f 63 56 64   v ? v : allocVd
ff50: 62 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a  be(pParse);.}...
ff60: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
ff70: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
ff80: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
ff90: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
ffa0: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
ffb0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
ffc0: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
ffd0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
ffe0: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
fff0: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
10000 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
10010 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
10020 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
10030 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
10040 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
10050 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
10060 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
10070 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
10080 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
10090 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
100a0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
100b0 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
100c0 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
100d0 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
100e0 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
100f0 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
10100 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
10110 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
10120 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
10130 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
10140 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
10150 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
10160 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
10170 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
10180 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
10190 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
101a0 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
101b0 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
101c0 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
101d0 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
101e0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
101f0 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
10200 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
10210 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
10220 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
10230 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
10240 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
10250 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
10260 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
10270 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
10280 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
10290 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
102a0 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
102b0 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
102c0 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
102d0 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
102e0 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
102f0 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
10300 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
10310 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
10320 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
10330 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
10340 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
10350 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
10360 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
10370 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
10380 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
10390 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
103a0 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
103b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
103c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
103d0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
103e0 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
103f0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
10400 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
10410 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
10420 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
10430 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
10440 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  t n;.  if( p->iL
10450 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
10460 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
10470 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
10480 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
10490 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
104a0 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
104b0 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
104c0 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
104d0 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
104e0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
104f0 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
10500 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
10510 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
10520 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
10530 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
10540 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
10550 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
10560 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30   || p->pLimit!=0
10570 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   );.  if( p->pLi
10580 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
10590 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
105a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
105b0 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
105c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
105d0 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30      assert( v!=0
105e0 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
105f0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
10600 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20  (p->pLimit, &n) 
10610 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10630 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
10640 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
10650 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
10660 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
10670 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
10680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10690 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65  VdbeGoto(v, iBre
106a0 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
106b0 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
106c0 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74  nSelectRow>sqlit
106d0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
106e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
106f0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
10700 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
10710 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  );.        p->se
10720 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78  lFlags |= SF_Fix
10730 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d  edLimit;.      }
10740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10750 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10760 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
10770 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
10780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10790 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
107a0 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20  BeInt, iLimit); 
107b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
107c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
107d0 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
107e0 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
107f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10800 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
10810 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
10820 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10840 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
10850 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
10860 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
10870 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
10880 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
10890 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
108a0 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
108b0 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
108c0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
108d0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
108e0 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
108f0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
10900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10910 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
10920 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43   iOffset); VdbeC
10930 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
10940 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10950 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
10960 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
10970 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10980 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
10990 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
109a0 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  +1, iOffset);.  
109b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
109c0 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
109d0 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T"));.    }.  }.
109e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
109f0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
10a00 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
10a10 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
10a20 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
10a30 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
10a40 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
10a50 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
10a60 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
10a70 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
10a80 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
10a90 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
10aa0 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
10ab0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
10ac0 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
10ad0 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
10ae0 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
10af0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
10b00 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
10b10 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
10b20 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
10b30 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
10b40 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
10b50 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
10b60 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
10b70 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10b80 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
10b90 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
10ba0 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
10bb0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
10bc0 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
10bd0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
10be0 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
10bf0 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
10c00 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
10c10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
10c20 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f  l>=0 );.  /* iCo
10c30 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74  l must be less t
10c40 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  han p->pEList->n
10c50 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65  Expr.  Otherwise
10c60 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a   an error would.
10c70 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74    ** have been t
10c80 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d  hrown during nam
10c90 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64  e resolution and
10ca0 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61   we would not ha
10cb0 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74  ve gotten.  ** t
10cc0 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28  his far */.  if(
10cd0 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41   pRet==0 && ALWA
10ce0 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  YS(iCol<p->pELis
10cf0 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
10d00 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
10d10 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
10d20 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
10d30 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
10d40 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
10d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
10d60 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
10d70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
10d80 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
10d90 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
10da0 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
10db0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
10dc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
10dd0 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
10de0 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
10df0 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
10e00 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
10e10 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
10e20 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
10e30 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
10e40 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
10e50 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
10e60 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
10e70 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
10e80 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
10e90 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
10ea0 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
10eb0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
10ec0 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
10ed0 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
10ee0 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
10ef0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
10f00 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
10f10 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
10f20 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
10f30 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
10f40 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
10f50 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
10f60 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10f70 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10f80 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
10f90 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
10fa0 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
10fb0 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
10fc0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
10fd0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
10fe0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
10ff0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
11000 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11010 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
11020 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
11030 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
11040 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
11050 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
11060 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
11070 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
11080 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
11090 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
110a0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
110b0 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
110c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
110d0 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
110e0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
110f0 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
11100 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
11110 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
11120 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
11130 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
11140 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
11150 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
11160 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11170 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
11180 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
11190 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
111a0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
111b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
111c0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
111d0 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
111e0 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
111f0 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
11200 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
11210 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
11220 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
11230 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
11240 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
11250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11260 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
11270 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
11280 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
11290 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
112a0 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
112b0 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
112c0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
112d0 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
112e0 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
112f0 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
11300 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
11310 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
11340 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
11350 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
11360 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
11380 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
11390 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
113a0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
113b0 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
113c0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
113d0 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
113e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
113f0 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
11400 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
11410 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
11420 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  a[].fg.isRecursi
11430 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54  ve flag..**.** T
11440 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72  he setup-query r
11450 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65  uns once to gene
11460 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20  rate an initial 
11470 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  set of rows that
11480 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75   go.** into a Qu
11490 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73  eue table.  Rows
114a0 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
114b0 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61  rom the Queue ta
114c0 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e  ble one by.** on
114d0 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74  e.  Each row ext
114e0 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
114f0 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70  e is output to p
11500 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Dest.  Then the 
11510 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63  single.** extrac
11520 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20  ted row (now in 
11530 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62  the iCurrent tab
11540 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  le) becomes the 
11550 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a  content of the.*
11560 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  * recursive-tabl
11570 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76  e for a recursiv
11580 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68  e-query run.  Th
11590 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
115a0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a  recursive-query.
115b0 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b  ** is added back
115c0 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
115d0 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f  table.  Then ano
115e0 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72  ther row is extr
115f0 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
11600 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72  .** and the iter
11610 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20  ation continues 
11620 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
11630 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
11640 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
11650 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72  pound query oper
11660 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68  ator is UNION th
11670 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20  en no duplicate 
11680 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a  rows are ever.**
11690 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
116a0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
116b0 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74   The iDistinct t
116c0 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70  able keeps a cop
116d0 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a  y of all rows.**
116e0 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20   that have ever 
116f0 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
11700 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75  to Queue and cau
11710 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74  ses duplicates t
11720 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65  o be.** discarde
11730 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61  d.  If the opera
11740 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c  tor is UNION ALL
11750 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65  , then duplicate
11760 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  s are allowed..*
11770 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  * .** If the que
11780 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20  ry has an ORDER 
11790 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73  BY, then entries
117a0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61   in the Queue ta
117b0 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a  ble are kept in.
117c0 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  ** ORDER BY orde
117d0 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  r and the first 
117e0 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74  entry is extract
117f0 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c  ed for each cycl
11800 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61  e.  Without.** a
11810 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
11820 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a  Queue table is j
11830 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a  ust a FIFO..**.*
11840 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61  * If a LIMIT cla
11850 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c  use is provided,
11860 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
11870 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20  ion stops after 
11880 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61  LIMIT rows.** ha
11890 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74  ve been output t
118a0 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49  o pDest.  A LIMI
118b0 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20  T of zero means 
118c0 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77  to output no row
118d0 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74  s and a.** negat
118e0 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20  ive LIMIT means 
118f0 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f  to output all ro
11900 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ws.  If there is
11910 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20   also an OFFSET 
11920 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61  clause.** with a
11930 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
11940 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
11950 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61  OFFSET outputs a
11960 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74  re discarded rat
11970 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e  her.** than bein
11980 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e  g sent to pDest.
11990 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e    The LIMIT coun
119a0 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
119b0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46   until after OFF
119c0 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65  SET.** rows have
119d0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a   been skipped..*
119e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
119f0 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
11a00 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73  iveQuery(.  Pars
11a10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11a20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11a30 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
11a40 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11a50 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65  /* The recursive
11a60 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f   SELECT to be co
11a70 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
11a80 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
11a90 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
11aa0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
11ab0 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
11ac0 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
11ad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
11ae0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
11af0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
11b00 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  */.  int nCol = 
11b10 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11b20 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
11b30 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
11b40 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a  ecursive table *
11b50 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
11b60 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
11b70 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
11b80 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
11b90 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
11ba0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74  /.  Select *pSet
11bb0 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20  up = p->pPrior; 
11bc0 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71    /* The setup q
11bd0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64  uery */.  int ad
11be0 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
11bf0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
11c00 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
11c10 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  int addrCont, ad
11c20 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a  drBreak;      /*
11c30 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52   CONTINUE and BR
11c40 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f  EAK addresses */
11c50 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
11c60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
11c70 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20   /* The Current 
11c80 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
11c90 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20  egCurrent;      
11ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11cb0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72  ster holding Cur
11cc0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
11cd0 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20  int iQueue;     
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cf0 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   The Queue table
11d00 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69   */.  int iDisti
11d10 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nct = 0;        
11d20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
11d30 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20   unique results 
11d40 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e  if UNION */.  in
11d50 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69  t eDest = SRT_Fi
11d60 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  fo;         /* H
11d70 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51  ow to write to Q
11d80 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ueue */.  Select
11d90 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20  Dest destQueue; 
11da0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
11db0 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67  tDest targetting
11dc0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11dd0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11e00 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11e30 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c   code */.  ExprL
11e40 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
11e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11e60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11e70 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
11e80 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20  t, *pOffset;    
11e90 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49     /* Saved LIMI
11ea0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
11eb0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20    int regLimit, 
11ec0 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20  regOffset;      
11ed0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65  /* Registers use
11ee0 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f  d by LIMIT and O
11ef0 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  FFSET */..  /* O
11f00 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74  btain authorizat
11f10 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75  ion to do a recu
11f20 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
11f30 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11f40 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
11f50 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20  LITE_RECURSIVE, 
11f60 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
11f70 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73  n;..  /* Process
11f80 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
11f90 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69  FFSET clauses, i
11fa0 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a  f they exist */.
11fb0 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71    addrBreak = sq
11fc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11fd0 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
11fe0 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
11ff0 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
12000 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
12010 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
12020 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
12030 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
12040 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73  >pLimit;.  pOffs
12050 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
12060 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
12070 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
12080 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
12090 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
120a0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
120b0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
120c0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
120d0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
120e0 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
120f0 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
12100 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
12110 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
12120 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
12130 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
12140 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
12150 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52  Src->a[i].fg.isR
12160 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
12170 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
12180 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
12190 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
121a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
121b0 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
121c0 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
121d0 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
121e0 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
121f0 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
12200 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
12210 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
12220 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
12230 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
12240 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
12250 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
12260 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
12270 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
12280 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
12290 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
122a0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
122b0 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
122c0 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
122d0 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
122e0 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
122f0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
12300 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
12310 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
12320 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
12330 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
12340 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
12350 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
12360 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
12370 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
12380 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
12390 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
123a0 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
123b0 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
123c0 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
123d0 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
123e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
123f0 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
12400 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
12410 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
12420 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
12430 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
12440 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
12450 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
12460 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
12470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12480 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
12490 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
124a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
124b0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
124c0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
124d0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
124e0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
124f0 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
12500 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
12510 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
12520 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12530 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
12540 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
12550 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
12560 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
12570 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
12580 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
12590 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
125a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
125b0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
125c0 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
125d0 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
125e0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
125f0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
12600 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
12610 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12620 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
12630 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
12640 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
12650 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
12660 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
12670 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
12680 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
12690 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72  ->pNext = 0;.  r
126a0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
126b0 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70  t(pParse, pSetup
126c0 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20  , &destQueue);. 
126d0 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
126e0 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   p;.  if( rc ) g
126f0 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72  oto end_of_recur
12700 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f  sive_query;..  /
12710 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
12720 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65  row in the Queue
12730 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74   and output that
12740 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f   row */.  addrTo
12750 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
12760 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
12770 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72  nd, iQueue, addr
12780 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
12790 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  rage(v);..  /* T
127a0 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74  ransfer the next
127b0 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76   row in Queue ov
127c0 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f  er to Current */
127d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
127e0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
127f0 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f  ow, iCurrent); /
12800 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d  * To reset colum
12810 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28  n cache */.  if(
12820 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
12830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12840 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
12850 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
12860 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43  y->nExpr+1, regC
12870 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  urrent);.  }else
12880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12890 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
128a0 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72  wData, iQueue, r
128b0 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a  egCurrent);.  }.
128c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
128d0 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
128e0 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
128f0 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67   Output the sing
12900 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
12910 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20  t */.  addrCont 
12920 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12930 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64  eLabel(v);.  cod
12940 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66  eOffset(v, regOf
12950 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b  fset, addrCont);
12960 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
12970 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
12980 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e  >pEList, iCurren
12990 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70  t,.      0, 0, p
129a0 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Dest, addrCont, 
129b0 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
129c0 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20  ( regLimit ){.  
129d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
129e0 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
129f0 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74  mpZero, regLimit
12a00 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
12a10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
12a20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12a30 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12a40 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a  (v, addrCont);..
12a50 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65    /* Execute the
12a60 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
12a70 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e  T taking the sin
12a80 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
12a90 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76  nt as.  ** the v
12aa0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63  alue for the rec
12ab0 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74  ursive-table. St
12ac0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
12ad0 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20  in the Queue..  
12ae0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
12af0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
12b00 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ate ){.    sqlit
12b10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12b20 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67  e, "recursive ag
12b30 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
12b40 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b  not supported");
12b50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
12b60 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
12b70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
12b80 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
12b90 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
12ba0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
12bb0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
12bc0 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
12bd0 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
12be0 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
12bf0 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
12c00 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
12c10 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
12c20 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
12c30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
12c40 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
12c50 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
12c60 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
12c70 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
12c80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
12c90 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
12ca0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
12cb0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
12cc0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70  = pLimit;.  p->p
12cd0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
12ce0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
12cf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12d00 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46  MIT_CTE */../* F
12d10 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
12d20 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
12d30 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
12d40 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
12d50 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12d60 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12d70 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12d90 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
12da0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
12db0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
12dc0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12dd0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12de0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12df0 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  /.);../*.** Hand
12e00 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  le the special c
12e10 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ase of a compoun
12e20 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
12e30 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a  iginates from a.
12e40 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ** VALUES clause
12e50 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74  .  By handling t
12e60 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
12e70 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20   case, we avoid 
12e80 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f  deep.** recursio
12e90 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e  n, and thus do n
12ea0 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72  ot need to enfor
12eb0 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  ce the SQLITE_LI
12ec0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
12ed0 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55  ECT.** on a VALU
12ee0 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ES clause..**.**
12ef0 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c   Because the Sel
12f00 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69  ect object origi
12f10 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c  nates from a VAL
12f20 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20  UES clause:.**  
12f30 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c   (1) It has no L
12f40 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a  IMIT or OFFSET.*
12f50 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
12f60 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
12f70 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
12f80 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
12f90 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ause.*/.static i
12fa0 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61  nt multiSelectVa
12fb0 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lues(.  Parse *p
12fc0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
12fd0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12fe0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13000 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
13010 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
13020 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
13030 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
13040 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
13050 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
13060 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
13070 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e  *pPrior;.  int n
13080 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
13090 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
130a0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
130b0 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a  F_MultiValue );.
130c0 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
130d0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
130e0 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20  SF_Values );.   
130f0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
13100 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70  TK_ALL || (p->op
13110 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70  ==TK_SELECT && p
13120 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a  ->pPrior==0) );.
13130 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13140 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Limit==0 );.    
13150 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
13160 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  et==0 );.    ass
13170 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
13180 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
13190 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e  Expr==p->pNext->
131a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
131b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69  .    if( p->pPri
131c0 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or==0 ) break;. 
131d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50     assert( p->pP
131e0 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29  rior->pNext==p )
131f0 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  ;.    p = p->pPr
13200 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b  ior;.    nRow++;
13210 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20  .  }while(1);.  
13220 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
13230 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
13240 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  or;.    p->pPrio
13250 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
13260 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13270 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
13280 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
13290 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28   pPrior;.    if(
132a0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
132b0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
132c0 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70   nRow;.    p = p
132d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  ->pNext;.  }.  r
132e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
132f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13300 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
13310 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
13320 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
13330 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
13340 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
13350 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
13360 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
13370 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
13380 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
13390 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
133a0 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
133b0 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
133c0 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
133d0 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
133e0 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
133f0 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
13400 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
13410 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
13420 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13430 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
13440 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
13450 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
13460 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
13470 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
13480 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
13490 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
134a0 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
134b0 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
134c0 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
134d0 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
134e0 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
134f0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
13500 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
13510 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
13520 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
13530 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
13540 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
13550 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
13560 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
13570 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
13580 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
13590 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
135a0 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
135b0 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
135c0 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
135e0 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
135f0 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
13600 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
13610 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
13620 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
13630 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
13640 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
13650 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
13660 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
13670 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
13680 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
13690 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
136a0 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
136b0 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
136c0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
136d0 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
136e0 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
136f0 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
13700 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
13710 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
13720 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
13730 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
13740 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
13750 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
13760 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
13770 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
13780 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13790 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
137a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
137b0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
137c0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
137d0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
137e0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
137f0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
13800 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
13810 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
13820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13830 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
13840 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
13850 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
13860 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
13870 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
13880 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
13890 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
138a0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
138b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
138c0 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
138d0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
138e0 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
138f0 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
13900 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
13910 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
13920 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
13930 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
13940 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
13950 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
13960 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
13970 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
13980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13990 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
139a0 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20  t iSub1 = 0;    
139b0 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
139c0 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
139d0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20   */.  int iSub2 
139e0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
139f0 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
13a00 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
13a10 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
13a20 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
13a30 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
13a40 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
13a50 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
13a60 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
13a70 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
13a80 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
13a90 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
13aa0 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
13ab0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
13ac0 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b   && p->pPrior );
13ad0 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e    /* Calling fun
13ae0 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73  ction guarantees
13af0 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20   this much */.  
13b00 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
13b10 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
13b20 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70  ive)==0 || p->op
13b30 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f  ==TK_ALL || p->o
13b40 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
13b50 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
13b60 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
13b70 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d  pPrior;.  dest =
13b80 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
13b90 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
13ba0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13bb0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
13bc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
13bd0 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
13be0 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
13bf0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
13c00 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
13c10 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
13c20 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13c30 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
13c40 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
13c50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13c60 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
13c70 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
13c80 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
13c90 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
13ca0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
13cb0 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
13cc0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
13cd0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
13ce0 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
13cf0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13d00 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
13d10 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
13d20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
13d30 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
13d40 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
13d50 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
13d60 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
13d70 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
13d80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
13d90 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
13da0 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
13db0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
13dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13dd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
13de0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
13df0 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
13e00 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
13e10 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
13e20 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
13e30 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c  /* Special handl
13e40 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ing for a compou
13e50 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f  nd-select that o
13e60 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56  riginates as a V
13e70 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20  ALUES clause..  
13e80 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
13e90 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
13ea0 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  alue ){.    rc =
13eb0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
13ec0 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  es(pParse, p, &d
13ed0 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d  est);.    goto m
13ee0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13f00 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
13f10 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
13f20 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
13f30 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
13f40 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
13f50 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
13f60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
13f70 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
13f80 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73  ->pEList );.  as
13f90 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
13fa0 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e  >nExpr==pPrior->
13fb0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
13fc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13fd0 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
13fe0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13ff0 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
14000 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65    generateWithRe
14010 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61  cursiveQuery(pPa
14020 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
14030 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
14040 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
14050 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
14060 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
14070 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
14080 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
14090 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
140a0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
140b0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
140c0 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
140d0 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
140e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
140f0 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
14100 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
14110 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
14120 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
14130 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
14140 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ALL: {.      int
14150 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
14160 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20   int nLimit;.   
14170 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
14180 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
14190 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
141a0 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
141b0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
141c0 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
141d0 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  et;.      pPrior
141e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
141f0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
14200 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
14210 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
14220 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14230 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14240 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14250 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14260 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14270 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
14280 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14290 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
142a0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
142b0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
142c0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
142d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
142e0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
142f0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
14300 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
14310 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
14320 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
14330 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
14340 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
14350 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
14360 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14370 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
14380 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
14390 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
143a0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
143b0 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
143c0 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
143d0 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
143e0 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
143f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
14400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14410 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69  v, OP_OffsetLimi
14420 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14440 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
14450 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73  fset+1, p->iOffs
14460 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
14470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
14480 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14490 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
144a0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
144b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
144c0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
144d0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
144e0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
144f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
14500 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
14510 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14520 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
14530 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
14540 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
14550 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
14560 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
14570 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
14580 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
14590 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
145a0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
145b0 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
145c0 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
145d0 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
145e0 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
145f0 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  > sqlite3LogEst(
14600 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20  (u64)nLimit) .  
14610 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
14620 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
14630 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
14640 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
14650 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
14660 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
14670 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14680 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
14690 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
146a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
146b0 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
146c0 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
146d0 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
146e0 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
146f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
14700 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
14710 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
14720 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
14730 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
14740 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
14750 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
14760 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
14770 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
14780 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
14790 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
147a0 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
147b0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
147c0 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
147d0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
147e0 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
147f0 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
14800 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
14810 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
14820 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
14830 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
14840 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
14850 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14860 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
14870 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
14880 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
14890 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
148a0 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
148b0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
148c0 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
148d0 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
148e0 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
148f0 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
14900 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
14910 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14920 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
14930 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
14940 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
14950 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
14960 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14970 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
14980 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
14990 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
149a0 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
149b0 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
149c0 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
149d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
149e0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
149f0 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
14a00 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
14a10 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
14a20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
14a30 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
14a40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
14a50 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
14a60 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14a70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14a80 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
14a90 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
14aa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ab0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14ac0 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
14ad0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
14ae0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
14af0 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
14b00 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
14b10 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
14b20 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64  dr;.        find
14b30 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
14b40 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
14b50 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
14b60 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14b70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
14b80 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14b90 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
14ba0 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
14bb0 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
14bc0 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
14bd0 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
14be0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
14bf0 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
14c00 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
14c10 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
14c20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14c30 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14c40 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14c50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14c60 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14c70 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
14c80 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
14c90 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
14ca0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
14cb0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
14cc0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14cd0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
14ce0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
14cf0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
14d00 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
14d10 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
14d20 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
14d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
14d40 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
14d50 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
14d60 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
14d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14d80 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
14d90 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
14da0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
14db0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14dc0 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
14dd0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
14de0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
14df0 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
14e00 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
14e10 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14e20 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
14e30 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14e40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14e50 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14e60 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
14e70 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
14e80 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
14e90 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  K );.      /* Qu
14ea0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
14eb0 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
14ec0 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
14ed0 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
14ee0 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
14ef0 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
14f00 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
14f10 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
14f20 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
14f30 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
14f40 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
14f50 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
14f60 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
14f70 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14f80 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
14f90 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
14fa0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
14fb0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
14fc0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
14fd0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
14fe0 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
14ff0 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
15000 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
15010 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
15020 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
15030 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
15040 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
15050 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
15060 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
15070 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
15080 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
15090 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->iOffset = 0;..
150a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
150b0 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
150c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
150d0 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
150e0 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
150f0 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
15100 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
15110 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
15120 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74  ( unionTab==dest
15130 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74  .iSDParm || dest
15140 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
15150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
15160 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
15170 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
15180 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
15190 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
151a0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
151b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
151c0 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
151d0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
151e0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
151f0 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
15200 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
15210 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
15220 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
15230 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
15240 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
15250 28 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d  (pParse, pFirst-
15260 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70  >pSrc, pFirst->p
15270 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
15280 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
15290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
152a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
152b0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
152c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
152d0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
152e0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
152f0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
15300 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
15310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15320 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
15330 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
15340 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15350 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
15360 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
15370 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15380 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
15390 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
153a0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
153b0 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  onTab,.         
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
153d0 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
153e0 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
153f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15400 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
15410 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
15420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15430 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
15440 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
15450 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15470 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15480 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
15490 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
154a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
154b0 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
154c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
154d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
154e0 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
154f0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
15500 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
15510 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
15520 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
15530 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
15540 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
15550 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
15560 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
15570 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
15580 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
15590 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
155a0 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
155b0 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
155c0 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
155d0 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
155e0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
155f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
15600 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
15610 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
15620 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
15630 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
15640 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
15650 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
15660 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
15670 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
15680 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
15690 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
156a0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
156b0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
156c0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
156d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
156e0 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
156f0 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
15700 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
15710 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
15720 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
15730 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
15740 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
15750 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
15760 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
15770 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
15780 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
15790 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
157a0 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
157b0 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
157c0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
157d0 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
157e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
157f0 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
15800 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
15810 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
15820 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
15830 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
15840 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
15850 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15860 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
15870 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
15880 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
15890 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
158a0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
158b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
158c0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
158d0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
158e0 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
158f0 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
15900 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
15910 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15930 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
15940 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
15950 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
15960 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
15970 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
15980 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
15990 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
159a0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
159b0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
159c0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
159d0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
159e0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
159f0 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
15a00 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
15a10 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
15a20 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
15a30 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
15a40 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
15a50 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
15a60 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
15a70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15a80 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
15a90 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
15aa0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
15ab0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
15ac0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
15ad0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
15ae0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
15af0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
15b00 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
15b10 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
15b20 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
15b30 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
15b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15b50 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
15b60 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
15b70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
15b80 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
15b90 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a  set = pOffset;..
15ba0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
15bb0 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
15bc0 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
15bd0 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
15be0 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
15bf0 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
15c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15c10 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
15c20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
15c30 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
15c40 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
15c50 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
15c60 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
15c70 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
15c80 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
15c90 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
15ca0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
15cb0 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e 70  Parse, pFirst->p
15cc0 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  Src, pFirst->pEL
15cd0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
15ce0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
15cf0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15d00 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
15d10 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
15d20 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
15d30 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
15d40 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
15d50 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
15d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d70 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
15d80 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
15d90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15da0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
15db0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
15dc0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
15dd0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
15de0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15df0 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
15e00 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15e10 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
15e20 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
15e30 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20  ab2, iCont, r1, 
15e40 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
15e50 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15e60 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15e70 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
15e80 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
15e90 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
15ea0 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a  ->pEList, tab1,.
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
15ed0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
15ee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15ef0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15f00 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
15f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f20 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15f30 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56  tab1, iStart); V
15f40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15f60 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15f70 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
15f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15f90 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
15fa0 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
15fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15fc0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
15fd0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
15fe0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
15ff0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
16000 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
16010 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
16020 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a  p->op!=TK_ALL);.
16030 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
16040 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16050 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
16060 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
16070 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
16080 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
16090 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
160a0 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
160b0 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
160c0 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
160d0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
160e0 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
160f0 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
16100 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
16110 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
16120 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16130 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
16140 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
16150 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
16160 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
16170 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
16180 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
16190 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
161a0 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
161b0 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
161c0 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
161d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
161e0 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
161f0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
16200 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16220 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
16230 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
16240 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
16250 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
16260 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
16270 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
16280 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
16290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
162a0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
162b0 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
162c0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
162d0 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
162e0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
162f0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
16300 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
16310 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
16320 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16340 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
16350 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
16360 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
16370 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  p->pNext==0 );. 
16380 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
16390 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
163a0 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
163b0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
163c0 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  b, nCol, 1);.   
163d0 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
163e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
163f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
16400 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
16410 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
16420 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20   }.    for(i=0, 
16430 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
16440 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
16450 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
16460 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
16470 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
16480 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
16490 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
164a0 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
164b0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
164c0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
164d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
164e0 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
164f0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
16500 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
16510 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
16520 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
16530 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
16540 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
16550 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
16560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
16570 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
16580 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
16590 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
165a0 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
165b0 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
165c0 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
165d0 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
165e0 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
165f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
16600 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
16610 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
16620 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16630 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16650 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
16660 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
16670 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16680 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
16690 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
166a0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
166b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
166d0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
166e0 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
166f0 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
16700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16710 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
16720 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
16730 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
16740 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
16750 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64  iSdst = dest.iSd
16760 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64  st;.  pDest->nSd
16770 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b  st = dest.nSdst;
16780 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
16790 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65  Delete(db, pDele
167a0 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  te);.  return rc
167b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
167c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
167d0 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
167e0 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  .** Error messag
167f0 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f  e for when two o
16800 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  r more terms of 
16810 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
16820 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  t have different
16830 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20  .** size result 
16840 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sets..*/.void sq
16850 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67  lite3SelectWrong
16860 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61  NumTermsError(Pa
16870 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
16880 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
16890 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
168a0 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71  Values ){.    sq
168b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
168c0 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
168d0 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
168e0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
168f0 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  erms");.  }else{
16900 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16910 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
16920 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
16930 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
16940 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
16950 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
16960 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
16970 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
16980 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
16990 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
169a0 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
169b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
169c0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
169d0 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
169e0 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
169f0 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
16a00 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
16a10 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
16a20 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
16a30 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
16a40 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
16a50 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
16a60 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
16a70 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
16a80 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
16a90 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
16aa0 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
16ab0 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
16ac0 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
16ad0 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
16ae0 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
16af0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
16b00 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
16b10 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
16b20 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
16b30 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
16b40 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
16b50 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
16b60 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
16b70 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
16b80 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
16b90 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
16ba0 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
16bb0 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
16bc0 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
16bd0 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
16be0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
16bf0 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
16c00 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
16c10 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
16c20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
16c30 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
16c40 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
16c50 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
16c60 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
16c70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
16c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
16c90 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
16ca0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
16cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16cc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16cd0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
16ce0 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
16cf0 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
16d00 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
16d10 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
16d20 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
16d30 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
16d40 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
16d50 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
16d60 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
16d70 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
16d80 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
16d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
16da0 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
16db0 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
16dc0 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
16dd0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16de0 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
16df0 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
16e00 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
16e10 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
16e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
16e30 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
16e40 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
16e50 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
16e60 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
16e70 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
16e80 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
16e90 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
16ea0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
16eb0 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
16ec0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
16ed0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
16ee0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
16ef0 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
16f00 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
16f10 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
16f20 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
16f30 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
16f40 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
16f50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16f60 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
16f70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16f80 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  v);.    addr2 = 
16f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16fa0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
16fb0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
16fc0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
16fd0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
17000 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
17010 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
17020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17030 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
17040 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69 43  ump, addr2+2, iC
17050 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b 32  ontinue, addr2+2
17060 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17070 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
17080 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17090 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
170a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
170b0 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53  OP_Copy, pIn->iS
170c0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
170d0 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20  pIn->nSdst-1);. 
170e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
170f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
17100 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
17110 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
17120 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
17130 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
17140 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
17150 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
17160 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
17170 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
17180 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
17190 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
171a0 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
171b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 65  ;..  assert( pDe
171c0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45  st->eDest!=SRT_E
171d0 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72  xists );.  asser
171e0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  t( pDest->eDest!
171f0 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
17200 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
17210 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
17220 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
17230 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
17240 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
17250 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
17260 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
17270 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
17280 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
17290 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
172a0 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
172b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
172c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
172d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
172e0 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
172f0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17300 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
17310 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17320 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
17330 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
17340 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
17350 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17360 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
17370 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32  >iSDParm, r1, r2
17380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17390 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
173a0 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
173b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
173c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
173d0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  se, r2);.      s
173e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
173f0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
17400 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17410 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
17420 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17430 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
17440 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
17450 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
17460 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
17470 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17480 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
17490 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
174a0 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
174b0 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20  nSdst>1 );.     
174c0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
174d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
174e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
174f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
17500 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
17510 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
17520 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 31  t, .          r1
17530 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
17540 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
17550 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17560 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
17570 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
17580 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17590 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
175a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
175b0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
175c0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
175d0 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , r1,.          
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
17600 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
17610 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17620 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
17630 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17640 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17650 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
17660 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
17670 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
17680 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
17690 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
176a0 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
176b0 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
176c0 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
176d0 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
176e0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
176f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
17700 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
17710 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
17720 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =1 || pParse->nE
17730 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73  rr>0 );  testcas
17740 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31  e( pIn->nSdst!=1
17750 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17760 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
17770 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
17780 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
17790 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
177a0 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
177b0 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
177c0 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
177d0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
177e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
177f0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
17800 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
17810 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
17820 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
17830 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
17840 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
17850 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
17860 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
17870 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
17880 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
17890 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
178a0 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
178b0 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
178c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
178d0 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
178e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
178f0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
17900 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
17910 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
17920 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
17930 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
17940 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
17950 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
17960 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49  pDest->iSdst, pI
17970 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17990 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
179a0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
179b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
179c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
179d0 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
179e0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
179f0 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
17a00 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
17a10 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
17a20 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
17a30 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
17a40 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
17a50 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
17a60 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
17a70 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
17a80 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
17a90 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
17aa0 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
17ab0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
17ac0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
17ad0 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
17ae0 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
17af0 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
17b00 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
17b10 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
17b20 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
17b30 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
17b40 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
17b50 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
17b60 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
17b70 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
17b80 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
17b90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17ba0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
17bb0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
17bc0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
17bd0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
17be0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
17bf0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
17c00 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17c10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
17c30 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
17c40 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
17c50 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
17c60 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
17c70 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
17c80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17c90 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
17ca0 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
17cb0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
17cc0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
17cd0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
17ce0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
17cf0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
17d00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17d10 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
17d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17d30 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
17d40 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
17d50 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
17d60 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
17d70 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
17d80 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
17d90 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
17da0 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
17db0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
17dc0 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
17dd0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
17de0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
17df0 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
17e00 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
17e10 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
17e20 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
17e30 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
17e40 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
17e50 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
17e60 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
17e70 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
17e80 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
17e90 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
17ea0 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
17eb0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
17ec0 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
17ed0 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
17ee0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
17ef0 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
17f00 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
17f10 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
17f20 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
17f30 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
17f40 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
17f50 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
17f60 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
17f70 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
17f80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
17f90 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
17fa0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
17fb0 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
17fc0 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
17fe0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
17ff0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
18000 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
18010 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
18020 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
18030 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
18050 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
18060 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
18070 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
18080 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
18090 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
180a0 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
180b0 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
180c0 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
180d0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
180e0 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
180f0 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
18100 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
18110 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
18120 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
18130 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
18140 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
18150 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
18160 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
18170 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
18180 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
18190 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
181a0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
181b0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
181c0 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
181d0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
181e0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
181f0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
18200 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
18210 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
18220 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
18230 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
18240 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
18250 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
18260 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
18270 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
18280 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
18290 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
182a0 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
182b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
182c0 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
182d0 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
182e0 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
182f0 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
18300 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
18310 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
18320 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
18330 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
18340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
18350 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
18360 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
18370 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
18380 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
18390 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
183a0 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
183b0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
183c0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
183d0 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
183e0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
183f0 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
18400 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
18410 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
18420 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
18430 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
18440 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
18450 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
18460 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
18470 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
18480 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
18490 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
184a0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
184b0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
184c0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
184d0 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
184e0 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
184f0 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
18500 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
18510 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
18520 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
18530 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
18540 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
18550 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
18560 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
18570 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
18580 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
18590 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
185a0 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
185b0 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
185c0 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
185d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
185e0 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
185f0 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
18600 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
18610 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
18620 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
18630 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
18640 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
18650 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
18660 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
18670 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
18680 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
18690 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
186a0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
186b0 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
186c0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
186d0 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
186e0 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
186f0 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
18700 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
18710 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
18720 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
18730 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
18740 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
18750 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
18760 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
18770 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
18780 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
18790 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
187a0 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
187b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
187c0 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
187d0 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
187e0 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
187f0 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
18800 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
18810 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
18820 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
18830 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
18840 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
18850 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
18860 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
18870 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
18880 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
18890 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
188a0 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
188b0 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
188c0 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
188d0 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
188e0 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
188f0 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
18900 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
18910 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
18920 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
18930 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
18940 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
18950 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
18960 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
18970 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
18980 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
18990 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
189a0 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
189b0 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
189c0 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
189d0 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
189e0 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
189f0 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
18a00 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
18a10 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
18a20 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
18a30 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
18a40 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
18a50 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
18a60 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
18a70 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
18a80 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
18a90 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
18aa0 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
18ab0 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
18ac0 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
18ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
18ae0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
18af0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
18b00 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
18b10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
18b20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
18b30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
18b40 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
18b50 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
18b60 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
18b70 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
18b80 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
18b90 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
18ba0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
18bb0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
18bc0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
18bd0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
18be0 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
18bf0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
18c00 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
18c10 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
18c20 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
18c30 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
18c40 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
18c50 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
18c60 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
18c70 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
18c80 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
18c90 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
18ca0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
18cb0 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
18cc0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
18cd0 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
18ce0 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
18cf0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
18d00 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
18d10 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
18d20 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
18d30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18d40 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
18d50 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
18d60 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18d70 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
18d80 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18d90 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
18da0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18db0 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
18dc0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18dd0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
18de0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
18df0 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
18e00 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
18e10 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
18e20 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
18e30 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
18e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
18e50 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18e60 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
18e70 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18e80 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
18e90 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18ea0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
18eb0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18ec0 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
18ed0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
18ee0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
18ef0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18f00 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
18f10 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18f20 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
18f30 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
18f40 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18f50 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
18f60 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
18f70 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
18f80 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
18f90 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
18fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18fb0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
18fc0 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
18fd0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18fe0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
18ff0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19000 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
19010 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
19020 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
19030 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19040 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
19050 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
19060 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
19070 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
19080 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
19090 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
190a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
190b0 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
190c0 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
190d0 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
190e0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
190f0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
19100 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
19110 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
19120 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
19130 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
19140 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
19150 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
19160 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
19170 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
19180 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
19190 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
191a0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
191b0 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
191c0 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
191d0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
191e0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
191f0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
19200 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
19210 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
19220 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
19230 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
19240 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
19250 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
19260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
19270 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
19280 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
19290 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
192a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
192b0 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
192c0 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
192d0 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
192e0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
192f0 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
19300 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
19310 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
19320 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
19330 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
19340 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
19350 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
19360 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
19370 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
19380 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
19390 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
193a0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
193b0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
193c0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
193d0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
193e0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
193f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19400 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
19410 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
19420 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
19430 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
19440 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
19450 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
19460 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
19470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19480 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
19490 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
194a0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
194b0 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
194c0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
194d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
194e0 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
194f0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
19500 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
19510 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
19520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
19530 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
19540 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
19550 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
19560 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
19570 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
19580 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
19590 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
195a0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
195b0 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
195c0 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
195d0 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
195e0 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
195f0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19600 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
19610 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19620 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
19630 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
19640 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
19650 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
19660 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
19670 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
19680 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
19690 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
196a0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
196b0 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
196c0 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
196d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
196e0 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
196f0 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
19700 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
19710 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
19720 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
19730 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19740 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
19750 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
19760 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
19770 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
19780 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19790 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
197a0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
197b0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
197c0 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
197d0 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
197e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
197f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
19800 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19810 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
19820 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
19830 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
19840 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
19850 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
19860 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
19870 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
19880 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19890 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
198a0 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
198b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
198c0 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
198d0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
198e0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
198f0 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
19900 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
19910 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
19920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
19930 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
19940 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
19950 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
19960 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
19970 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ue = i;.        
19980 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
19990 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
199a0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
199b0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
199c0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
199d0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
199e0 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65  OrderBy->a[nOrde
199f0 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65  rBy++].u.x.iOrde
19a00 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b  rByCol = (u16)i;
19a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19a20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
19a30 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
19a40 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20  permutation and 
19a50 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20  keyinfo that is 
19a60 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  used with.  ** t
19a70 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75  he permutation u
19a80 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
19a90 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a   if the next.  *
19aa0 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73  * row of results
19ab0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65   comes from sele
19ac0 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20  ctA or selectB. 
19ad0 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63   Also add explic
19ae0 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  it.  ** collatio
19af0 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ns to the ORDER 
19b00 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
19b10 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
19b20 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a   subqueries.  **
19b30 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e   to the right an
19b40 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65  d the left are e
19b50 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75  valuated, they u
19b60 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  se the correct. 
19b70 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20   ** collation.. 
19b80 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   */.  aPermute =
19b90 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
19ba0 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
19bb0 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42 79 20  (int)*(nOrderBy 
19bc0 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61 50 65  + 1));.  if( aPe
19bd0 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
19be0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19bf0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 50  m *pItem;.    aP
19c00 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64  ermute[0] = nOrd
19c10 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d  erBy;.    for(i=
19c20 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  1, pItem=pOrderB
19c30 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42  y->a; i<=nOrderB
19c40 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
19c50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19c60 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
19c70 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
19c80 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
19c90 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19ca0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
19cb0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72  pr );.      aPer
19cc0 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  mute[i] = pItem-
19cd0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19ce0 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
19cf0 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74  pKeyMerge = mult
19d00 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
19d10 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
19d20 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
19d30 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
19d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
19d50 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
19d60 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
19d70 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
19d80 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
19d90 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
19da0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
19db0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
19dc0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
19dd0 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
19de0 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
19df0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
19e00 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
19e10 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
19e20 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
19e30 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
19e40 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
19e50 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
19e60 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
19e70 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
19e80 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
19e90 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
19ea0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
19eb0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
19ec0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
19ed0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
19ee0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
19ef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
19f00 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
19f10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19f20 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
19f30 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
19f40 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
19f50 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
19f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19f70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19f80 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
19f90 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
19fa0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
19fb0 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31  loc(db, nExpr, 1
19fc0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
19fd0 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  up ){.      asse
19fe0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
19ff0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
1a000 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20  eyDup) );.      
1a010 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
1a020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1a030 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
1a040 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
1a050 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1a060 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
1a070 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
1a080 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
1a090 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
1a0a0 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
1a0b0 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
1a0c0 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
1a0d0 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
1a0e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1a0f0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1a100 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
1a110 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1a120 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
1a130 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
1a140 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
1a150 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
1a160 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1a170 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
1a180 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
1a190 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
1a1a0 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
1a1b0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
1a1c0 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
1a1d0 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
1a1e0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
1a1f0 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
1a200 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
1a210 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
1a220 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
1a230 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a240 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
1a250 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a270 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1a280 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
1a290 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
1a2a0 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1a2d0 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
1a2e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a2f0 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
1a300 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
1a310 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1a320 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
1a330 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
1a340 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1a350 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
1a360 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
1a370 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
1a380 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
1a390 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66  ffset);.  p->pOf
1a3a0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  fset = 0;..  reg
1a3b0 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
1a3c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
1a3d0 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
1a3e0 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
1a3f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a400 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
1a410 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
1a420 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1a430 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
1a440 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1a450 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
1a460 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
1a470 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
1a480 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
1a490 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a4a0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1a4b0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1a4c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
1a4d0 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
1a4e0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
1a4f0 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
1a500 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1a510 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
1a520 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1a530 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1a540 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1a550 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1a560 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1a570 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53  gAddrA, 0, addrS
1a580 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43  electA);.  VdbeC
1a590 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74  omment((v, "left
1a5a0 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
1a5b0 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
1a5c0 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c  egLimitA;.  expl
1a5d0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
1a5e0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
1a5f0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
1a600 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1a610 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
1a620 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
1a630 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1a640 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  v, regAddrA);.  
1a650 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1a660 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
1a670 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1a680 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
1a690 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
1a6a0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
1a6b0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
1a6c0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
1a6d0 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1a6e0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1a6f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1a700 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1a710 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a720 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1a730 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
1a740 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
1a750 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1a760 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
1a770 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
1a780 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
1a790 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
1a7a0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
1a7b0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
1a7c0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1a7d0 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
1a7e0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
1a7f0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
1a800 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
1a810 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1a820 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
1a830 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
1a840 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
1a850 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
1a860 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
1a870 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
1a880 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
1a890 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1a8a0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1a8b0 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1a8c0 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
1a8d0 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1a8e0 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1a8f0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1a900 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
1a910 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a920 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
1a930 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
1a940 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
1a950 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
1a960 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
1a970 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
1a980 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
1a990 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
1a9a0 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
1a9b0 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
1a9c0 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
1a9d0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1a9e0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
1a9f0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1aa00 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
1aa10 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
1aa20 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
1aa30 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
1aa40 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
1aa50 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
1aa60 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
1aa70 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1aa80 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
1aa90 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
1aaa0 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
1aab0 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1aac0 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aae0 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
1aaf0 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1ab10 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1ab20 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  belEnd);.  }.  s
1ab30 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
1ab40 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20  ef(pKeyDup);..  
1ab50 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1ab60 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1ab70 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1ab80 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
1ab90 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1aba0 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1abb0 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
1abc0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1abd0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
1abe0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1abf0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1ac00 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41  A_noB = addrEofA
1ac10 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d   = labelEnd;.  }
1ac20 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1ac30 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1ac40 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
1ac50 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1ac60 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
1ac70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1ac80 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1ac90 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72  rOutB);.    addr
1aca0 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74  EofA_noB = sqlit
1acb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1acc0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1acd0 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  rB, labelEnd);. 
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ad10 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1ad20 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
1ad30 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
1ad40 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
1ad50 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
1ad60 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
1ad70 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
1ad80 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1ad90 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1ada0 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1adb0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1adc0 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
1add0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1ade0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1adf0 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
1ae00 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
1ae10 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1ae20 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
1ae30 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
1ae40 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
1ae50 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
1ae60 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1ae70 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1ae80 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
1ae90 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1aea0 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
1aeb0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1aec0 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
1aed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1aee0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1aef0 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1af00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1af10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1af20 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62  d, regAddrA, lab
1af30 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  elEnd); VdbeCove
1af40 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1af50 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1af60 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
1af70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1af80 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1af90 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
1afa0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1afb0 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
1afc0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1afd0 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
1afe0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1aff0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1b000 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1b010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b020 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b030 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1b040 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1b050 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1b060 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b070 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
1b080 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1b090 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1b0a0 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
1b0b0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1b0c0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1b0d0 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
1b0e0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1b0f0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1b100 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1b110 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
1b120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
1b130 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1b140 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
1b150 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1b160 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
1b170 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b180 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b190 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1b1a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b1b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b1c0 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1b1d0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
1b1e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1b1f0 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1b200 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
1b210 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1b220 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
1b230 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
1b240 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1b250 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1b260 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1b270 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1b280 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1b290 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b2a0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1b2b0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
1b2c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b2d0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b2e0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1b2f0 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1b300 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1b310 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b320 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
1b330 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
1b340 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
1b350 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
1b360 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1b370 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1b380 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b390 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b3a0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1b3b0 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43  EofA_noB); VdbeC
1b3c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b3d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b3e0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b3f0 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1b400 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b410 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
1b420 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
1b430 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
1b440 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1b450 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
1b460 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
1b470 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
1b480 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
1b490 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
1b4a0 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
1b4b0 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
1b4c0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1b4d0 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
1b4e0 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
1b4f0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
1b520 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
1b530 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b540 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
1b550 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73  AG_PERMUTE);.  s
1b560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b570 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
1b580 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c  rAltB, addrAeqB,
1b590 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65   addrAgtB); Vdbe
1b5a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1b5b0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
1b5c0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
1b5d0 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
1b5e0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1b5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b600 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1b610 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65  elEnd);..  /* Se
1b620 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1b630 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20  output columns. 
1b640 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
1b650 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
1b660 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ut ){.    Select
1b670 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f   *pFirst = pPrio
1b680 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46  r;.    while( pF
1b690 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
1b6a0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
1b6b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65  pPrior;.    gene
1b6c0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
1b6d0 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e  pParse, pFirst->
1b6e0 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45  pSrc, pFirst->pE
1b6f0 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
1b700 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1b710 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1b720 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1b730 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1b740 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1b750 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1b760 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1b770 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b780 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1b790 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1b7a0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1b7b0 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1b7c0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1b7d0 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1b7e0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1b7f0 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1b800 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1b810 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1b820 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
1b830 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
1b840 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
1b850 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
1b860 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
1b870 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rr!=0;.}.#endif.
1b880 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1b890 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1b8a0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1b8b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1b8c0 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63  )../* An instanc
1b8d0 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f  e of the SubstCo
1b8e0 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73  ntext object des
1b8f0 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69  cribes an substi
1b900 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74  tution edit.** t
1b910 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  o be performed o
1b920 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a  n a parse tree..
1b930 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65  **.** All refere
1b940 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
1b950 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20  in table iTable 
1b960 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  are to be replac
1b970 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64  ed by correspond
1b980 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
1b990 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f  ns in pEList..*/
1b9a0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1b9b0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20  SubstContext {. 
1b9c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1b9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b9e0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1b9f0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  t */.  int iTabl
1ba00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ba10 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65   /* Replace refe
1ba20 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
1ba30 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  able */.  int iN
1ba40 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  ewTable;        
1ba50 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65      /* New table
1ba60 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
1ba70 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20   isLeftJoin;    
1ba80 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b         /* Add TK
1ba90 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63  _IF_NULL_ROW opc
1baa0 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70  odes on each rep
1bab0 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  lacement */.  Ex
1bac0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1bad0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61          /* Repla
1bae0 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f  cement expressio
1baf0 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e  ns */.} SubstCon
1bb00 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72  text;../* Forwar
1bb10 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
1bb20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1bb30 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73  bstExprList(Subs
1bb40 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c  tContext*, ExprL
1bb50 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1bb60 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53  id substSelect(S
1bb70 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65  ubstContext*, Se
1bb80 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  lect*, int);../*
1bb90 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
1bba0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1bbb0 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
1bbc0 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
1bbd0 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
1bbe0 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
1bbf0 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
1bc00 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
1bc10 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
1bc20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
1bc30 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
1bc40 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
1bc50 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
1bc60 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
1bc70 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
1bc80 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
1bc90 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
1bca0 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
1bcb0 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
1bcc0 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
1bcd0 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
1bce0 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
1bcf0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
1bd00 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
1bd10 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
1bd20 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
1bd30 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
1bd40 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
1bd50 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
1bd60 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
1bd70 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
1bd80 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
1bd90 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
1bda0 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
1bdb0 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
1bdc0 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
1bdd0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1bde0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
1bdf0 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
1be00 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74  bstExpr(.  Subst
1be10 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1be20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1be30 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1be40 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1be50 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
1be60 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
1be70 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
1be80 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  ccurs */.){.  if
1be90 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1bea0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70  urn 0;.  if( Exp
1beb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1bec0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
1bed0 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68   && pExpr->iRigh
1bee0 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62  tJoinTable==pSub
1bef0 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20  st->iTable ){.  
1bf00 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a    pExpr->iRightJ
1bf10 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62 73  oinTable = pSubs
1bf20 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1bf30 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
1bf40 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
1bf50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1bf60 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b  Subst->iTable ){
1bf70 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1bf80 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
1bf90 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1bfa0 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
1bfb0 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
1bfc0 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
1bfd0 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74 2d  *pCopy = pSubst-
1bfe0 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72  >pEList->a[pExpr
1bff0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
1c000 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66 4e  ;.      Expr ifN
1c010 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61 73  ullRow;.      as
1c020 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70 45  sert( pSubst->pE
1c030 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
1c040 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73 74  ->iColumn<pSubst
1c050 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1c060 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c070 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
1c080 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
1c090 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t==0 );.      if
1c0a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1c0b0 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a  ector(pCopy) ){.
1c0c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c0d0 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 53  ectorErrorMsg(pS
1c0e0 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 43  ubst->pParse, pC
1c0f0 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  opy);.      }els
1c100 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1c110 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74 2d  e3 *db = pSubst-
1c120 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20  >pParse->db;.   
1c130 20 20 20 20 20 69 66 28 20 70 53 75 62 73 74 2d       if( pSubst-
1c140 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70  >isLeftJoin && p
1c150 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Copy->op!=TK_COL
1c160 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
1c170 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52   memset(&ifNullR
1c180 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 66  ow, 0, sizeof(if
1c190 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20  NullRow));.     
1c1a0 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f       ifNullRow.o
1c1b0 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  p = TK_IF_NULL_R
1c1c0 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OW;.          if
1c1d0 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20  NullRow.pLeft = 
1c1e0 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  pCopy;.         
1c1f0 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c   ifNullRow.iTabl
1c200 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77  e = pSubst->iNew
1c210 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1c220 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c   pCopy = &ifNull
1c230 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Row;.        }. 
1c240 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1c250 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1c260 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20   pCopy, 0);.    
1c270 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
1c280 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
1c290 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1c2a0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1c2b0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1c2c0 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  = pExpr->iRightJ
1c2d0 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  oinTable;.      
1c2e0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
1c2f0 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a  |= EP_FromJoin;.
1c300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c310 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1c320 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
1c330 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
1c340 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNew;.      }.  
1c350 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1c360 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
1c370 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1c380 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1c390 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  .    pExpr->pRig
1c3a0 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ht = substExpr(p
1c3b0 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52  Subst, pExpr->pR
1c3c0 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45  ight);.    if( E
1c3d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c3e0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1c3f0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
1c400 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c  stSelect(pSubst,
1c410 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1c420 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 1);.    }else
1c430 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1c440 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 45  rList(pSubst, pE
1c450 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
1c460 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c470 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
1c480 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1c490 4c 69 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e  List(.  SubstCon
1c4a0 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a  text *pSubst, /*
1c4b0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1c4c0 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1c4d0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1c4e0 70 4c 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c  pList       /* L
1c4f0 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
1c500 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1c510 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
1c520 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1c530 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1c540 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1c550 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1c560 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  i++){.    pList-
1c570 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75  >a[i].pExpr = su
1c580 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1c590 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1c5a0 72 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  r);.  }.}.static
1c5b0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1c5c0 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78  t(.  SubstContex
1c5d0 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65  t *pSubst, /* De
1c5e0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1c5f0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1c600 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1c610 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
1c620 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1c630 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1c640 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
1c650 20 69 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20   int doPrior    
1c660 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62         /* Do sub
1c670 73 74 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70  stitutes on p->p
1c680 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a  Prior too */.){.
1c690 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1c6a0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1c6b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1c6c0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70   int i;.  if( !p
1c6d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b   ) return;.  do{
1c6e0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1c6f0 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45  st(pSubst, p->pE
1c700 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
1c710 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1c720 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20   p->pGroupBy);. 
1c730 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1c740 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64  (pSubst, p->pOrd
1c750 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48  erBy);.    p->pH
1c760 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1c770 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61  r(pSubst, p->pHa
1c780 76 69 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57  ving);.    p->pW
1c790 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1c7a0 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65  (pSubst, p->pWhe
1c7b0 72 65 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  re);.    pSrc = 
1c7c0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73  p->pSrc;.    ass
1c7d0 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
1c7e0 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
1c7f0 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63  nSrc, pItem=pSrc
1c800 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
1c810 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
1c820 75 62 73 74 53 65 6c 65 63 74 28 70 53 75 62 73  ubstSelect(pSubs
1c830 74 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  t, pItem->pSelec
1c840 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
1c850 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
1c860 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
1c870 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1c880 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e  ubst, pItem->u1.
1c890 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20  pFuncArg);.     
1c8a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
1c8b0 65 28 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70  e( doPrior && (p
1c8c0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30   = p->pPrior)!=0
1c8d0 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   );.}.#endif /* 
1c8e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1c8f0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1c900 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1c910 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1c920 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1c930 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1c940 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1c950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1c960 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
1c970 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1c980 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
1c990 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
1c9a0 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
1c9b0 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
1c9c0 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
1c9d0 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
1c9e0 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
1c9f0 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
1ca00 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
1ca10 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
1ca20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
1ca30 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1ca40 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
1ca50 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1ca60 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
1ca70 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1ca80 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
1ca90 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
1caa0 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
1cab0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
1cac0 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
1cad0 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
1cae0 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
1caf0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1cb00 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
1cb10 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
1cb20 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
1cb30 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
1cb40 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
1cb50 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
1cb60 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
1cb70 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
1cb80 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
1cb90 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1cba0 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
1cbb0 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
1cbc0 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
1cbd0 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1cbe0 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
1cbf0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1cc00 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
1cc10 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
1cc20 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
1cc30 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
1cc40 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
1cc50 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
1cc60 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
1cc70 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1cc80 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
1cc90 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
1cca0 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
1ccb0 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74  this simplificat
1ccc0 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
1ccd0 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
1cce0 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
1ccf0 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
1cd00 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
1cd10 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
1cd20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
1cd30 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
1cd40 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
1cd50 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
1cd60 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
1cd70 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
1cd80 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
1cd90 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1cda0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1cdb0 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
1cdc0 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1cdd0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1cde0 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
1cdf0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
1ce00 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1ce10 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1ce20 67 61 74 65 20 6f 72 20 28 32 61 29 20 74 68 65  gate or (2a) the
1ce30 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1ce40 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20  not a join.**   
1ce50 20 20 20 20 20 61 6e 64 20 28 32 62 29 20 74 68       and (2b) th
1ce60 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1ce70 65 73 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75  es not use subqu
1ce80 65 72 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e  eries other than
1ce90 20 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20   the one.**     
1cea0 20 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73     FROM-clause s
1ceb0 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20  ubquery that is 
1cec0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
1ced0 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62  flattening.  (2b
1cee0 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75   is.**        du
1cef0 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37  e to ticket [2f7
1cf00 31 37 30 64 37 33 62 66 39 61 62 66 38 30 5d 20  170d73bf9abf80] 
1cf10 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e  from 2015-02-09.
1cf20 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54  ).**.**   (3)  T
1cf30 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1cf40 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  ot the right ope
1cf50 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
1cf60 4f 49 4e 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72  OIN.**        or
1cf70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1cf80 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
1cf90 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  in..**.**   (4) 
1cfa0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1cfb0 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a   not DISTINCT..*
1cfc0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
1cfd0 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
1cfe0 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
1cff0 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
1d000 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
1d010 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
1d020 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
1d030 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
1d040 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
1d050 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
1d060 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
1d070 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
1d080 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
1d090 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
1d0a0 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  eries..**.**   (
1d0b0 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
1d0c0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1d0d0 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1d0e0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1d0f0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1d100 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
1d110 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
1d120 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
1d130 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
1d140 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
1d150 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
1d160 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
1d170 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
1d180 4f 4d 20 63 6c 61 75 73 65 20 77 69 74 68 20 74  OM clause with t
1d190 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1d1a0 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1d1b0 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1d1c0 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1d1d0 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1d1e0 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1d1f0 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1d200 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
1d210 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1d220 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1d230 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1d240 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1d250 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
1d260 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1d270 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1d280 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1d290 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1d2a0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1d2b0 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74    (**)  Restrict
1d2c0 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d  ion (10) was rem
1d2d0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f  oved from the co
1d2e0 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35  de on 2005-02-05
1d2f0 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   but we.**      
1d300 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72    accidently car
1d310 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ried the comment
1d320 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32   forward until 2
1d330 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67  014-09-15.  Orig
1d340 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  inal.**        t
1d350 65 78 74 3a 20 22 54 68 65 20 73 75 62 71 75 65  ext: "The subque
1d360 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1d370 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
1d380 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a  e outer query .*
1d390 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f  *        does no
1d3a0 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a  t use LIMIT.".**
1d3b0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
1d3c0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1d3d0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1d3e0 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
1d3f0 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
1d400 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
1d410 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
1d420 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
1d430 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
1d440 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
1d450 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
1d460 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
1d470 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
1d480 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
1d490 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
1d4a0 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
1d4b0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1d4c0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
1d4d0 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
1d4e0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1d4f0 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
1d500 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
1d510 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
1d520 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1d530 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
1d540 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
1d550 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
1d560 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
1d570 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
1d580 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
1d590 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
1d5a0 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
1d5b0 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1d5c0 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1d5d0 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
1d5e0 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
1d5f0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
1d600 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
1d610 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
1d620 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
1d630 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
1d640 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
1d650 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
1d660 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
1d670 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
1d680 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1d690 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
1d6a0 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
1d6b0 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
1d6c0 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
1d6d0 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
1d6e0 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
1d6f0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
1d700 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
1d710 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1d720 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1d730 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
1d740 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1d750 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
1d760 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1d770 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1d780 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
1d790 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
1d7a0 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
1d7b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1d7c0 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1d7d0 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1d7e0 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1d7f0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1d800 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1d810 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1d820 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1d830 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1d840 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1d850 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1d860 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1d870 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1d880 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1d890 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1d8a0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1d8b0 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1d8c0 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1d8d0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1d8e0 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1d8f0 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1d900 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1d910 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1d920 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1d930 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1d940 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1d950 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1d960 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1d970 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1d980 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1d990 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1d9a0 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1d9b0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1d9c0 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1d9d0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1d9e0 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1d9f0 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1da00 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1da10 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1da20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1da30 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1da40 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1da50 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1da60 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1da70 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1da80 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1da90 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1daa0 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1dab0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1dac0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1dad0 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1dae0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1daf0 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
1db00 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1db10 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1db20 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1db30 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1db40 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1db50 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
1db60 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1db70 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1db80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1db90 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
1dba0 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
1dbb0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
1dbc0 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
1dbd0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1dbe0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1dbf0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
1dc00 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
1dc10 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1dc20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
1dc30 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
1dc40 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
1dc50 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
1dc60 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
1dc70 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1dc80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1dc90 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
1dca0 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
1dcb0 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
1dcc0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
1dcd0 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
1dce0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
1dcf0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
1dd00 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
1dd10 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
1dd20 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
1dd30 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1dd40 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1dd50 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1dd60 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1dd70 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
1dd80 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
1dd90 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
1dda0 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75   (22)  The subqu
1ddb0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ery is not a rec
1ddc0 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
1ddd0 2a 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72  *  (23)  The par
1dde0 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ent is not a rec
1ddf0 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74  ursive CTE, or t
1de00 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1de10 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  not a.**        
1de20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1de30 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
1de40 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e   is because tran
1de50 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20  sforming the.** 
1de60 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f         parent to
1de70 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1de80 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63  y confuses the c
1de90 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73  ode that handles
1dea0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72  .**        recur
1deb0 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20  sive queries in 
1dec0 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a  multiSelect()..*
1ded0 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20  *.**  (24)  The 
1dee0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1def0 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
1df00 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
1df10 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
1df20 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
1df30 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
1df40 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
1df50 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
1df60 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
1df70 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
1df80 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
1df90 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
1dfa0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1dfb0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
1dfc0 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
1dfd0 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
1dfe0 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a  ximal.).**.**.**
1dff0 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
1e000 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
1e010 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
1e020 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
1e030 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
1e040 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
1e050 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
1e060 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1e070 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
1e080 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
1e090 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
1e0a0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1e0b0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1e0c0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1e0d0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1e0e0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
1e0f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e100 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
1e110 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
1e120 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
1e130 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
1e140 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
1e150 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
1e160 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
1e170 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
1e180 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
1e190 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
1e1a0 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
1e1b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
1e1c0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
1e1d0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
1e1e0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
1e1f0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
1e200 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1e210 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1e220 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1e230 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
1e240 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
1e250 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
1e260 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1e270 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
1e280 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
1e290 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
1e2a0 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
1e2b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
1e2c0 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
1e2d0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1e2e0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
1e2f0 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
1e300 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
1e310 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1e320 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1e330 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1e340 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
1e350 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
1e360 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
1e370 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20  lect *pParent;  
1e380 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49    /* Current UNI
1e390 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74  ON ALL term of t
1e3a0 68 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a  he other query *
1e3b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1e3c0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
1e3d0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
1e3e0 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
1e3f0 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
1e400 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1e410 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
1e420 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
1e430 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1e440 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
1e450 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1e460 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e470 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1e480 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
1e490 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e4a0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1e4b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1e4c0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
1e4d0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
1e4e0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1e4f0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
1e500 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1e510 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
1e520 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
1e530 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
1e540 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
1e550 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
1e560 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
1e570 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
1e580 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
1e590 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
1e5a0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
1e5b0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
1e5c0 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e5e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1e5f0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1e620 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1e630 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1e640 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
1e650 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
1e660 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e670 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
1e680 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1e690 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1e6a0 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
1e6b0 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
1e6c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
1e6d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1e6e0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
1e6f0 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
1e700 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
1e710 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ries */.  if( Op
1e720 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1e730 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
1e740 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20  eryFlattener) ) 
1e750 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
1e760 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
1e770 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
1e780 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
1e790 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
1e7a0 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
1e7b0 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50  ->a[iFrom];.  iP
1e7c0 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
1e7d0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75  ->iCursor;.  pSu
1e7e0 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
1e7f0 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
1e800 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
1e810 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1e820 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  ){.    if( isAgg
1e830 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e860 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
1e870 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
1e880 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
1e890 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e8b0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 61 29  Restriction (2a)
1e8c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
1e8d0 3e 70 57 68 65 72 65 20 26 26 20 45 78 70 72 48  >pWhere && ExprH
1e8e0 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 57  asProperty(p->pW
1e8f0 68 65 72 65 2c 45 50 5f 53 75 62 71 75 65 72 79  here,EP_Subquery
1e900 29 29 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69  )).     || (sqli
1e910 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
1e920 28 70 2d 3e 70 45 4c 69 73 74 29 20 26 20 45 50  (p->pEList) & EP
1e930 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20  _Subquery)!=0.  
1e940 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78     || (sqlite3Ex
1e950 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70  prListFlags(p->p
1e960 4f 72 64 65 72 42 79 29 20 26 20 45 50 5f 53 75  OrderBy) & EP_Su
1e970 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20 29  bquery)!=0.    )
1e980 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1e990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e9c0 73 74 72 69 63 74 69 6f 6e 20 28 32 62 29 20 20  striction (2b)  
1e9d0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  */.    }.  }..  
1e9e0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
1e9f0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1ea00 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
1ea10 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
1ea20 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
1ea30 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
1ea40 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
1ea50 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
1ea60 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
1ea70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  ressions, we all
1ea80 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
1ea90 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
1eaa0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
1eab0 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
1eac0 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
1ead0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
1eae0 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
1eaf0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
1eb00 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
1eb10 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
1eb20 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
1eb30 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
1eb40 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
1eb50 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
1eb60 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
1eb70 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb90 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
1eba0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1ebb0 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72  >pOffset ) retur
1ebc0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ebe0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
1ebf0 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73  ) */.  if( (p->s
1ec00 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d  elFlags & SF_Com
1ec10 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75  pound)!=0 && pSu
1ec20 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
1ec30 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1ec70 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
1ec80 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
1ec90 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
1eca0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ecb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ecc0 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
1ecd0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1ece0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1ecf0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
1ed00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ed10 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f  triction (5)  */
1ed20 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1ed30 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
1ed40 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
1ed50 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1ed60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1ed70 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
1ed80 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
1ed90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1eda0 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73  istinct)!=0 && s
1edb0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1edc0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1edd0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1ede0 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
1edf0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
1ee00 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
1ee10 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65  derBy ){.     re
1ee20 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ee60 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (11) */.  }.  i
1ee70 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62  f( isAgg && pSub
1ee80 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
1ee90 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1eea0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1eeb0 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69  tion (16) */.  i
1eec0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1eed0 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  && p->pWhere ) r
1eee0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1eef0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1ef00 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69  tion (19) */.  i
1ef10 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1ef20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
1ef30 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1ef40 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
1ef50 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1ef60 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20  estriction (21) 
1ef70 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  */.  }.  testcas
1ef80 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  e( pSub->selFlag
1ef90 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1efa0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1efb0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1efc0 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b   SF_MinMaxAgg );
1efd0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1efe0 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
1eff0 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41  rsive|SF_MinMaxA
1f000 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  gg) ){.    retur
1f010 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74  n 0; /* Restrict
1f020 69 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32  ions (22) and (2
1f030 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  4) */.  }.  if( 
1f040 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f050 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
1f060 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1f070 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1f080 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33   Restriction (23
1f090 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ) */.  }..  /*. 
1f0a0 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
1f0b0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1f0c0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1f0d0 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
1f0e0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1f0f0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1f100 6e 20 69 74 73 65 6c 66 2e 20 20 45 78 61 6d 70  n itself.  Examp
1f110 6c 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  le of why this i
1f120 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1f130 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1f140 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1f150 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
1f160 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1f170 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1f180 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1f190 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1f1a0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1f1b0 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
1f1c0 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
1f1d0 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
1f1e0 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
1f1f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
1f200 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30 36  lso tickets #306
1f210 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33 30  , #350, and #330
1f220 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  0..  */.  if( (p
1f230 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
1f240 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
1f250 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65 66  !=0 ){.    isLef
1f260 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69  tJoin = 1;.    i
1f270 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1f280 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  >1 ){.      retu
1f290 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
1f2a0 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 20 20  tion (3) */.    
1f2b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  }.  }..  /* Rest
1f2c0 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74  riction 17: If t
1f2d0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1f2e0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
1f2f0 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a  T, then it must.
1f300 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68    ** use only th
1f310 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
1f320 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f  ator. And none o
1f330 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c  f the simple sel
1f340 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a  ect queries.  **
1f350 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
1f360 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
1f370 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  T are allowed to
1f380 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72   be aggregate or
1f390 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71   distinct.  ** q
1f3a0 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  ueries..  */.  i
1f3b0 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  f( pSub->pPrior 
1f3c0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ){.    if( pSub-
1f3d0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1f3e0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
1f3f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20   Restriction 20 
1f400 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
1f410 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65   isAgg || (p->se
1f420 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1f430 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63  inct)!=0 || pSrc
1f440 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20  ->nSrc!=1 ){.   
1f450 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1f460 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31   }.    for(pSub1
1f470 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53  =pSub; pSub1; pS
1f480 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f  ub1=pSub1->pPrio
1f490 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r){.      testca
1f4a0 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
1f4b0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1f4c0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1f4d0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
1f4e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f4f0 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
1f500 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1f510 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1f520 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20  )==SF_Aggregate 
1f530 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f540 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29   pSub->pSrc!=0 )
1f550 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f560 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
1f570 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69  xpr==pSub1->pELi
1f580 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1f590 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73     if( (pSub1->s
1f5a0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1f5b0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1f5c0 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20  ate))!=0.       
1f5d0 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f  || (pSub1->pPrio
1f5e0 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d  r && pSub1->op!=
1f5f0 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20  TK_ALL) .       
1f600 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e  || pSub1->pSrc->
1f610 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 29 7b 0a  nSrc<1.      ){.
1f620 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1f630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f640 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d  testcase( pSub1-
1f650 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b  >pSrc->nSrc>1 );
1f660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1f670 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a  estriction 18. *
1f680 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
1f690 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
1f6a0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
1f6b0 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
1f6c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
1f6d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1f6e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
1f6f0 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ii].u.x.iOrderBy
1f700 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
1f710 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1f720 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49  .  }..  /***** I
1f730 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1f740 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e  point, flattenin
1f750 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
1f760 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54  *****/.  SELECTT
1f770 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
1f780 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20  ("flatten %s.%p 
1f790 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c  from term %d\n",
1f7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f7b0 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61      pSub->zSelNa
1f7c0 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29  me, pSub, iFrom)
1f7d0 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69  );..  /* Authori
1f7e0 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ze the subquery 
1f7f0 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  */.  pParse->zAu
1f800 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62  thContext = pSub
1f810 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54  item->zName;.  T
1f820 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c  ESTONLY(i =) sql
1f830 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1f840 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
1f850 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ECT, 0, 0, 0);. 
1f860 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51   testcase( i==SQ
1f870 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70  LITE_DENY );.  p
1f880 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1f890 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
1f8a0 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49  Context;..  /* I
1f8b0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1f8c0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
1f8d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
1f8e0 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63  then (by restric
1f8f0 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e  tions.  ** 17 an
1f900 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d  d 18 above) it m
1f910 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41  ust be a UNION A
1f920 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e  LL and the paren
1f930 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20  t query must .  
1f940 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  ** be of the for
1f950 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
1f960 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69   SELECT <expr-li
1f970 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71  st> FROM (<sub-q
1f980 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c  uery>) <where-cl
1f990 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ause> .  **.  **
1f9a0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79   followed by any
1f9b0 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
1f9c0 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63   and/or OFFSET c
1f9d0 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f  lauses. This blo
1f9e0 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20  ck.  ** creates 
1f9f0 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68  N-1 copies of th
1fa00 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77  e parent query w
1fa10 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52  ithout any ORDER
1fa20 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20   BY, LIMIT or . 
1fa30 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73   ** OFFSET claus
1fa40 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65  es and joins the
1fa50 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61  m to the left-ha
1fa60 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f  nd-side of the o
1fa70 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69  riginal.  ** usi
1fa80 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  ng UNION ALL ope
1fa90 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20  rators. In this 
1faa0 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75  case N is the nu
1fab0 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20  mber of simple. 
1fac0 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65   ** select state
1fad0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d  ments in the com
1fae0 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e  pound sub-query.
1faf0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
1fb00 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
1fb10 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f    SELECT a+1 FRO
1fb20 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  M (.  **        
1fb30 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
1fb40 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
1fb50 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1fb60 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f      SELECT y FRO
1fb70 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
1fb80 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1fb90 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
1fba0 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62  bs(z*2) FROM tab
1fbb0 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45  2.  **     ) WHE
1fbc0 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59  RE a!=5 ORDER BY
1fbd0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61   1.  **.  ** Tra
1fbe0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20  nsformed into:. 
1fbf0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1fc00 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62  ECT x+1 FROM tab
1fc10 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20   WHERE x+1!=5.  
1fc20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
1fc30 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1fc40 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   y+1 FROM tab WH
1fc50 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE y+1!=5.  ** 
1fc60 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1fc70 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62  **     SELECT ab
1fc80 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61  s(z*2)+1 FROM ta
1fc90 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32  b2 WHERE abs(z*2
1fca0 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  )+1!=5.  **     
1fcb0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
1fcc0 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69    ** We call thi
1fcd0 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d  s the "compound-
1fce0 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
1fcf0 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ing"..  */.  for
1fd00 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69  (pSub=pSub->pPri
1fd10 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  or; pSub; pSub=p
1fd20 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
1fd30 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
1fd40 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
1fd50 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
1fd60 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  erBy;.    Expr *
1fd70 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
1fd80 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f  it;.    Expr *pO
1fd90 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
1fda0 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  et;.    Select *
1fdb0 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
1fdc0 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  or;.    p->pOrde
1fdd0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
1fde0 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pSrc = 0;.    p-
1fdf0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
1fe00 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1fe10 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
1fe20 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   0;.    pNew = s
1fe30 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
1fe40 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73  db, p, 0);.    s
1fe50 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
1fe60 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e  ame(pNew, pSub->
1fe70 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70  zSelName);.    p
1fe80 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
1fe90 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  set;.    p->pLim
1fea0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
1feb0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1fec0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e  OrderBy;.    p->
1fed0 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
1fee0 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b   p->op = TK_ALL;
1fef0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1ff00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   ){.      p->pPr
1ff10 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1ff20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1ff30 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
1ff40 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
1ff50 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
1ff60 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
1ff70 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74       pNew->pNext
1ff80 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = p;.      p->p
1ff90 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20  Prior = pNew;.  
1ffa0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
1ffb0 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20  2,pParse,p,.    
1ffc0 20 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d       ("compound-
1ffd0 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
1ffe0 65 72 20 63 72 65 61 74 65 73 20 25 73 2e 25 70  er creates %s.%p
1fff0 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20   as peer\n",.   
20000 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c        pNew->zSel
20010 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20  Name, pNew));.  
20020 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
20030 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
20040 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
20050 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e  /* Begin flatten
20060 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68  ing the iFrom-th
20070 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
20080 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20  OM clause .  ** 
20090 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
200a0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20  ry..  */.  pSub 
200b0 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74  = pSub1 = pSubit
200c0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  em->pSelect;..  
200d0 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72  /* Delete the tr
200e0 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
200f0 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74  ructure associat
20100 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
20110 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20   subquery.  */. 
20120 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20130 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  b, pSubitem->zDa
20140 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74  tabase);.  sqlit
20150 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
20160 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  bitem->zName);. 
20170 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20180 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  b, pSubitem->zAl
20190 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  ias);.  pSubitem
201a0 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
201b0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  .  pSubitem->zNa
201c0 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  me = 0;.  pSubit
201d0 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
201e0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c    pSubitem->pSel
201f0 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  ect = 0;..  /* D
20200 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  efer deleting th
20210 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61  e Table object a
20220 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
20230 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
20240 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65   until code gene
20250 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  ration is.  ** c
20260 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74  omplete, since t
20270 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65  here may still e
20280 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65  xist Expr.pTab e
20290 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a  ntries that.  **
202a0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75   refer to the su
202b0 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65  bquery even afte
202c0 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54  r flattening.  T
202d0 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a  icket #3346..  *
202e0 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d  *.  ** pSubitem-
202f0 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20  >pTab is always 
20300 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74  non-NULL by test
20310 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e   restrictions an
20320 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20  d tests above.. 
20330 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
20340 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21  (pSubitem->pTab!
20350 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  =0) ){.    Table
20360 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53   *pTabToDel = pS
20370 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ubitem->pTab;.  
20380 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d    if( pTabToDel-
20390 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20  >nTabRef==1 ){. 
203a0 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
203b0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
203c0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
203d0 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
203e0 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
203f0 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
20400 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
20410 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
20420 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
20430 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
20440 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
20450 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20  >nTabRef--;.    
20460 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
20470 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
20480 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
20490 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
204a0 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
204b0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
204c0 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
204d0 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
204e0 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
204f0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
20500 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
20510 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
20520 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
20530 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
20540 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
20550 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
20560 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
20570 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
20580 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
20590 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
205a0 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
205b0 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
205c0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
205d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
205e0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
205f0 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
20600 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
20610 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
20620 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
20630 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
20640 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
20650 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
20660 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
20670 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
20680 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
20690 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
206a0 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
206b0 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
206c0 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
206d0 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
206e0 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
206f0 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
20700 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
20710 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
20720 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
20730 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
20740 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
20750 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
20760 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
20770 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
20780 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
20790 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
207a0 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
207b0 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
207c0 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
207d0 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
207e0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
207f0 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
20800 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
20810 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
20820 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
20830 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
20840 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
20850 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
20860 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
20870 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
20880 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
20890 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
208a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
208b0 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
208c0 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
208d0 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
208e0 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
208f0 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
20900 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
20910 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20920 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
20930 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
20940 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
20950 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
20960 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
20970 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
20980 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
20990 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
209a0 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
209b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
209c0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
209d0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
209e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
209f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
20a00 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
20a10 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
20a20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
20a30 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
20a40 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
20a50 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
20a60 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
20a70 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
20a80 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
20a90 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
20aa0 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
20ab0 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
20ac0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
20ad0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
20ae0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
20af0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
20b00 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
20b10 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
20b20 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
20b30 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
20b40 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
20b50 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
20b60 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
20b70 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
20b80 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
20b90 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
20ba0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
20bb0 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
20bc0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
20bd0 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
20be0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
20bf0 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
20c00 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
20c10 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
20c20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20  to 4 slots..    
20c30 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c  ** The middle sl
20c40 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
20c50 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
20c60 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
20c70 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ce.    ** for th
20c80 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  e two elements i
20c90 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
20ca0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
20cb0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
20cc0 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
20cd0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
20ce0 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
20cf0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
20d00 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
20d10 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
20d20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
20d30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
20d40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20d50 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20d60 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
20d70 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
20d80 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
20d90 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
20da0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
20db0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
20dc0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
20dd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
20de0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
20df0 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
20e00 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
20e10 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
20e20 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e  ->a[i+iFrom].fg.
20e30 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
20e40 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
20e50 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
20e60 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 4e  ->a[i];.      iN
20e70 65 77 50 61 72 65 6e 74 20 3d 20 70 53 75 62 53  ewParent = pSubS
20e80 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
20e90 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
20ea0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
20eb0 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
20ec0 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
20ed0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
20ee0 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  m].fg.jointype =
20ef0 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
20f00 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
20f10 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
20f20 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
20f30 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
20f40 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
20f50 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
20f60 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
20f70 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
20f80 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
20f90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
20fa0 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
20fb0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
20fc0 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
20fd0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
20fe0 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21000 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
21010 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
21020 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
21030 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
21040 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21050 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
21060 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21070 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
21080 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
21090 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
210a0 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
210b0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
210c0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
210d0 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
210e0 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
210f0 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
21100 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
21110 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
21120 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  "..    */.    pL
21130 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ist = pParent->p
21140 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
21150 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
21160 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
21170 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
21180 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
21190 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
211a0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
211b0 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
211c0 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
211d0 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
211e0 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  (zName);.       
211f0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
21200 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
21210 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
21220 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
21230 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20   ){.      /* At 
21240 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20  this point, any 
21250 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42  non-zero iOrderB
21260 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64 69  yCol values indi
21270 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20  cate that the.  
21280 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
21290 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
212a0 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74  n is identical t
212b0 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43 6f  o the iOrderByCo
212c0 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65 78  l'th.      ** ex
212d0 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65  pression returne
212e0 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61 74  d by SELECT stat
212f0 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e 63  ement pSub. Sinc
21300 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a 20  e these values. 
21310 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e       ** do not n
21320 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65  ecessarily corre
21330 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73  spond to columns
21340 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65   in SELECT state
21350 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20 20  ment pParent,.  
21360 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d      ** zero them
21370 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72   before transfer
21380 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
21390 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a   clause..      *
213a0 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64  *.      ** Not d
213b0 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63 61  oing this may ca
213c0 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20  use an error if 
213d0 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  a subsequent cal
213e0 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20  l to this.      
213f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  ** function atte
21400 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
21410 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  a compound sub-q
21420 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65 6e  uery into pParen
21430 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20  t.      ** (the 
21440 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63 61  only way this ca
21450 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20 74  n happen is if t
21460 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
21470 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20 2a  query is.      *
21480 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74  * currently part
21490 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29 2e   of pSub->pSrc).
214a0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31 31   See ticket [d11
214b0 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20  a6e908f].  */.  
214c0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
214d0 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
214e0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 66  OrderBy;.      f
214f0 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
21500 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
21510 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
21520 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  y->a[i].u.x.iOrd
21530 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  erByCol = 0;.   
21540 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
21550 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
21560 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
21570 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
21580 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20  Prior==0 );.    
21590 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65    pParent->pOrde
215a0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
215b0 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64        pSub->pOrd
215c0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  erBy = 0;.    }.
215d0 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
215e0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
215f0 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29  pSub->pWhere, 0)
21600 3b 0a 20 20 20 20 69 66 28 20 69 73 4c 65 66 74  ;.    if( isLeft
21610 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 73 65  Join ){.      se
21620 74 4a 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65  tJoinExpr(pWhere
21630 2c 20 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20  , iNewParent);. 
21640 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62     }.    if( sub
21650 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
21660 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
21670 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ent->pHaving==0 
21680 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
21690 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72  ->pHaving = pPar
216a0 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  ent->pWhere;.   
216b0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
216c0 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
216d0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
216e0 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
216f0 72 41 6e 64 28 64 62 2c 20 0a 20 20 20 20 20 20  rAnd(db, .      
21700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
21710 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
21720 76 69 6e 67 2c 20 30 29 2c 20 70 50 61 72 65 6e  ving, 0), pParen
21730 74 2d 3e 70 48 61 76 69 6e 67 0a 20 20 20 20 20  t->pHaving.     
21740 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21750 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  ( pParent->pGrou
21760 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
21770 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
21780 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
21790 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d  istDup(db, pSub-
217a0 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20  >pGroupBy, 0);. 
217b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
217c0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
217d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
217e0 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61  (db, pWhere, pPa
217f0 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20  rent->pWhere);. 
21800 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
21810 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
21820 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43   ){.      SubstC
21830 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20  ontext x;.      
21840 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  x.pParse = pPars
21850 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c  e;.      x.iTabl
21860 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20  e = iParent;.   
21870 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d     x.iNewTable =
21880 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20   iNewParent;.   
21890 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
218a0 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20  = isLeftJoin;.  
218b0 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70      x.pEList = p
218c0 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  Sub->pEList;.   
218d0 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 26     substSelect(&
218e0 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  x, pParent, 0);.
218f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
21900 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
21910 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
21920 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
21930 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ner or the.    *
21940 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
21950 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20   distinct. .    
21960 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  */.    pParent->
21970 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62  selFlags |= pSub
21980 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
21990 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20  Distinct;.  .   
219a0 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43   /*.    ** SELEC
219b0 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
219c0 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
219d0 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
219e0 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a   OFFSET y;.    *
219f0 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20  *.    ** One is 
21a00 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74  tempted to try t
21a10 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f  o add a and b to
21a20 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d   combine the lim
21a30 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20  its.  But this. 
21a40 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77     ** does not w
21a50 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69  ork if either li
21a60 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
21a70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21a80 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
21a90 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
21aa0 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
21ab0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62  imit;.      pSub
21ac0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
21ad0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
21ae0 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
21af0 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
21b00 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
21b10 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
21b20 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
21b30 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
21b40 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66  db, pSub1);..#if
21b50 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
21b60 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
21b70 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
21b80 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x100 ){.    SEL
21b90 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
21ba0 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
21bb0 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29  flattening:\n"))
21bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
21bd0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
21be0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
21bf0 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
21c00 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
21c10 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
21c20 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
21c30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21c40 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66  _VIEW) */....#if
21c50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
21c60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
21c70 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
21c80 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
21c90 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  .** Make copies 
21ca0 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52  of relevant WHER
21cb0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
21cc0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
21cd0 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48  y into.** the WH
21ce0 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ERE clause of su
21cf0 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65  bquery.  Example
21d00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
21d10 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
21d20 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
21d30 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  y FROM t1) WHERE
21d40 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a   x=5 AND y=10;.*
21d50 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64  *.** Transformed
21d60 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   into:.**.**    
21d70 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
21d80 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d  ELECT a AS x, c-
21d90 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57  d AS y FROM t1 W
21da0 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64  HERE a=5 AND c-d
21db0 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52  =10).**     WHER
21dc0 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
21dd0 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69  **.** The hope i
21de0 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  s that the terms
21df0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
21e00 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d  ner query will m
21e10 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65  ake it more.** e
21e20 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
21e30 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
21e40 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
21e50 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29   if:.**.**   (1)
21e60 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
21e70 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
21e80 2e 20 20 28 49 6e 20 74 68 61 74 20 63 61 73 65  .  (In that case
21e90 2c 20 77 65 27 64 20 72 65 61 6c 6c 79 20 77 61  , we'd really wa
21ea0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 63  nt.**       to c
21eb0 6f 70 79 20 74 68 65 20 6f 75 74 65 72 20 57 48  opy the outer WH
21ec0 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE-clause terms
21ed0 20 6f 6e 74 6f 20 74 68 65 20 48 41 56 49 4e 47   onto the HAVING
21ee0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 0a 2a   clause of the.*
21ef0 2a 20 20 20 20 20 20 20 69 6e 6e 65 72 20 71 75  *       inner qu
21f00 65 72 79 2e 20 20 42 75 74 20 74 68 65 79 20 70  ery.  But they p
21f10 72 6f 62 61 62 6c 79 20 77 6f 6e 27 74 20 68 65  robably won't he
21f20 6c 70 20 74 68 65 72 65 20 73 6f 20 64 6f 20 6e  lp there so do n
21f30 6f 74 20 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a  ot bother.).**.*
21f40 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65  *   (2) The inne
21f50 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
21f60 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66  ecursive part of
21f70 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20   a common table 
21f80 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
21f90 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65  *   (3) The inne
21fa0 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49  r query has a LI
21fb0 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63  MIT clause (sinc
21fc0 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  e the changes to
21fd0 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20   the WHERE.**   
21fe0 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20      close would 
21ff0 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69  change the meani
22000 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29  ng of the LIMIT)
22010 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68  ..**.**   (4) Th
22020 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
22030 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
22040 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
22050 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c 65 72 0a  N.  (The caller.
22060 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f 72 63 65  **       enforce
22070 73 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  s this restricti
22080 6f 6e 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f  on since this ro
22090 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68  utine does not h
220a0 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20  ave enough.**   
220b0 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20      information 
220c0 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20  to know.).**.** 
220d0 20 20 28 35 29 20 54 68 65 20 57 48 45 52 45 20    (5) The WHERE 
220e0 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
220f0 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20  n originates in 
22100 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
22110 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
22120 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  of a LEFT JOIN..
22130 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  **.** Return 0 i
22140 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  f no changes are
22150 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65   made and non-ze
22160 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ro if one or mor
22170 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
22180 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c  * terms are dupl
22190 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20  icated into the 
221a0 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
221b0 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e  tic int pushDown
221c0 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61  WhereTerms(.  Pa
221d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
221e0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
221f0 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63  text (for malloc
22200 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70  () and error rep
22210 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c  orting) */.  Sel
22220 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20  ect *pSubq,     
22230 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
22240 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63  ry whose WHERE c
22250 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61  lause is to be a
22260 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78  ugmented */.  Ex
22270 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
22280 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
22290 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
222a0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
222b0 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20 20  int iCursor     
222c0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
222d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75  number of the su
222e0 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45  bquery */.){.  E
222f0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
22300 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 53 65   nChng = 0;.  Se
22310 6c 65 63 74 20 2a 70 58 3b 20 20 20 20 20 20 20  lect *pX;       
22320 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
22330 6e 67 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64  ng over compound
22340 20 53 45 4c 45 43 54 73 20 69 6e 20 70 53 75 62   SELECTs in pSub
22350 71 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72  q */.  if( pWher
22360 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
22370 0a 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b  .  for(pX=pSubq;
22380 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69   pX; pX=pX->pPri
22390 6f 72 29 7b 0a 20 20 20 20 69 66 28 20 28 70 58  or){.    if( (pX
223a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
223b0 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52 65  _Aggregate|SF_Re
223c0 63 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b 0a  cursive))!=0 ){.
223d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
223e0 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  pX->selFlags & S
223f0 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
22400 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
22410 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  X->selFlags & SF
22420 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20  _Recursive );.  
22430 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
22440 21 3d 70 53 75 62 71 20 29 3b 0a 20 20 20 20 20  !=pSubq );.     
22450 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
22460 73 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20 61  strictions (1) a
22470 6e 64 20 28 32 29 20 2a 2f 0a 20 20 20 20 7d 0a  nd (2) */.    }.
22480 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d    }.  if( pSubq-
22490 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20  >pLimit!=0 ){.  
224a0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
224b0 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a  estriction (3) *
224c0 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  /.  }.  while( p
224d0 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  Where->op==TK_AN
224e0 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b  D ){.    nChng +
224f0 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  = pushDownWhereT
22500 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75  erms(pParse, pSu
22510 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67  bq, pWhere->pRig
22520 68 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht, iCursor);.  
22530 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72    pWhere = pWher
22540 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  e->pLeft;.  }.  
22550 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
22560 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72  rty(pWhere,EP_Fr
22570 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
22580 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
22590 6f 6e 20 35 20 2a 2f 0a 20 20 69 66 28 20 73 71  on 5 */.  if( sq
225a0 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
225b0 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c  Constant(pWhere,
225c0 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20   iCursor) ){.   
225d0 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68   nChng++;.    wh
225e0 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20  ile( pSubq ){.  
225f0 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74      SubstContext
22600 20 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   x;.      pNew =
22610 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
22620 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65  pParse->db, pWhe
22630 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 78 2e  re, 0);.      x.
22640 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
22650 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20  .      x.iTable 
22660 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = iCursor;.     
22670 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69   x.iNewTable = i
22680 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e  Cursor;.      x.
22690 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a  isLeftJoin = 0;.
226a0 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d        x.pEList =
226b0 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a   pSubq->pEList;.
226c0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62        pNew = sub
226d0 73 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29  stExpr(&x, pNew)
226e0 3b 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70  ;.      pSubq->p
226f0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
22700 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
22710 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65  b, pSubq->pWhere
22720 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  , pNew);.      p
22730 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50  Subq = pSubq->pP
22740 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rior;.    }.  }.
22750 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a    return nChng;.
22760 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
22770 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
22780 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
22790 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
227a0 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
227b0 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
227c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
227d0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
227e0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
227f0 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
22800 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
22810 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
22820 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
22830 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
22840 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
22850 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
22860 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
22870 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
22880 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
22890 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
228a0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
228b0 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
228c0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
228d0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
228e0 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
228f0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
22900 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
22910 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
22920 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
22930 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
22940 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
22950 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
22960 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
22970 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
22980 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
22990 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
229a0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
229b0 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
229c0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
229d0 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
229e0 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
229f0 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
22a00 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
22a10 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
22a20 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
22a30 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
22a40 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
22a50 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
22a60 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
22a70 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
22a80 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
22a90 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
22aa0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
22ab0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
22ac0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
22ad0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
22ae0 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
22af0 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
22b00 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
22b10 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
22b20 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
22b30 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
22b40 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
22b50 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
22b60 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
22b70 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
22b80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
22b90 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
22ba0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
22bb0 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
22bc0 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
22bd0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
22be0 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
22bf0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
22c00 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
22c10 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
22c20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
22c30 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
22c40 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
22c50 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
22c60 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
22c70 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
22c80 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
22c90 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
22ca0 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
22cb0 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
22cc0 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
22cd0 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
22ce0 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
22cf0 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
22d00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
22d10 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
22d20 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
22d30 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
22d40 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
22d50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
22d60 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
22d70 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
22d80 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
22d90 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
22da0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
22db0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61  rgument is the a
22dc0 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
22dd0 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
22de0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
22df0 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
22e00 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
22e10 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
22e20 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
22e30 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
22e40 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
22e50 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
22e60 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
22e70 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
22e80 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
22e90 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
22ea0 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
22eb0 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
22ec0 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
22ed0 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
22ee0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
22ef0 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
22f00 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
22f10 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
22f20 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
22f30 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
22f40 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
22f50 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
22f60 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
22f70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
22f80 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
22f90 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
22fa0 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
22fb0 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
22fc0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
22fd0 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
22fe0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
22ff0 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
23000 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
23010 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
23020 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
23030 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
23040 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
23050 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
23060 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
23070 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
23080 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
23090 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
230a0 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
230b0 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
230c0 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
230d0 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
230e0 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
230f0 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
23100 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
23110 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
23120 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
23130 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
23140 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
23150 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
23160 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
23170 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
23180 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
23190 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
231a0 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
231b0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
231c0 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
231d0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
231e0 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
231f0 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
23200 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
23210 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
23220 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
23230 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
23240 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
23250 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
23260 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
23270 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
23280 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
23290 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
232a0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
232b0 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
232c0 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
232d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
232e0 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
232f0 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
23300 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
23310 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
23320 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
23330 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65  .    char *zInde
23340 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75  xedBy = pFrom->u
23350 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20  1.zIndexedBy;.  
23360 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
23370 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
23380 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
23390 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
233a0 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
233b0 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42  zName, zIndexedB
233c0 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  y); .        pId
233d0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
233e0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
233f0 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
23400 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
23410 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
23420 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65  ex: %s", zIndexe
23430 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dBy, 0);.      p
23440 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
23450 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
23460 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
23470 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
23480 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  om->pIBIndex = p
23490 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
234a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
234b0 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70  *.** Detect comp
234c0 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
234d0 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20  ements that use 
234e0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
234f0 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61  se with .** an a
23500 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
23510 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
23520 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e  *.**    SELECT .
23530 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
23540 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
23550 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e  M t2 ORDER BY ..
23560 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
23570 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77  ** These are rew
23580 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71  ritten as a subq
23590 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  uery:.**.**    S
235a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
235b0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
235c0 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
235d0 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20  .. FROM t2).**  
235e0 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20     ORDER BY ... 
235f0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
23600 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
23610 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
23620 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  ry because the m
23630 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
23640 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  y() routine.** a
23650 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61  bove that genera
23660 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
23670 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
23680 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
23690 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73   BY clause.** us
236a0 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72  es a merge algor
236b0 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72  ithm that requir
236c0 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
236d0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
236e0 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  n the.** result 
236f0 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68  columns as on th
23700 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
23710 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a  e.  See ticket.*
23720 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  * http://www.sql
23730 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
23740 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a  /6709574d2a.**.*
23750 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
23760 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65  ation is only ne
23770 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c  eded for EXCEPT,
23780 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20   INTERSECT, and 
23790 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e  UNION..** The UN
237a0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
237b0 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68   works fine with
237c0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
237d0 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a  rBy() even when.
237e0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c  ** there are COL
237f0 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68  LATE terms in th
23800 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73  e ORDER BY..*/.s
23810 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72  tatic int conver
23820 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
23830 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72  oSubquery(Walker
23840 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
23850 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t *p){.  int i;.
23860 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
23870 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20    Select *pX;.  
23880 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
23890 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
238a0 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73  tem *a;.  SrcLis
238b0 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61  t *pNewSrc;.  Pa
238c0 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54  rse *pParse;.  T
238d0 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69  oken dummy;..  i
238e0 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
238f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
23900 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e  tinue;.  if( p->
23910 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
23920 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
23930 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70  e;.  for(pX=p; p
23940 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b  X && (pX->op==TK
23950 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  _ALL || pX->op==
23960 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70  TK_SELECT); pX=p
23970 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69  X->pPrior){}.  i
23980 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72  f( pX==0 ) retur
23990 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
239a0 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42    a = p->pOrderB
239b0 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  y->a;.  for(i=p-
239c0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
239d0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
239e0 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78      if( a[i].pEx
239f0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  pr->flags & EP_C
23a00 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a  ollate ) break;.
23a10 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20    }.  if( i<0 ) 
23a20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23a30 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  nue;..  /* If we
23a40 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
23a50 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
23a60 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
23a70 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
23a80 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ..  pParse = pWa
23a90 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
23aa0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
23ab0 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
23ac0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
23ad0 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
23ae0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
23af0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
23b00 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ort;.  memset(&d
23b10 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ummy, 0, sizeof(
23b20 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53  dummy));.  pNewS
23b30 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
23b40 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
23b50 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26  m(pParse,0,0,0,&
23b60 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b  dummy,pNew,0,0);
23b70 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d  .  if( pNewSrc==
23b80 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
23b90 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20  bort;.  *pNew = 
23ba0 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20  *p;.  p->pSrc = 
23bb0 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45  pNewSrc;.  p->pE
23bc0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
23bd0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
23be0 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
23bf0 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52  xpr(db, TK_ASTER
23c00 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f  ISK, 0));.  p->o
23c10 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
23c20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a   p->pWhere = 0;.
23c30 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
23c40 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48   = 0;.  pNew->pH
23c50 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65  aving = 0;.  pNe
23c60 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  w->pOrderBy = 0;
23c70 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
23c80 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30  ;.  p->pNext = 0
23c90 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30  ;.  p->pWith = 0
23ca0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
23cb0 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
23cc0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
23cd0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e  elFlags & SF_Con
23ce0 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20  verted)==0 );.  
23cf0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
23d00 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61  F_Converted;.  a
23d10 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72  ssert( pNew->pPr
23d20 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  ior!=0 );.  pNew
23d30 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ->pPrior->pNext 
23d40 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
23d50 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  pLimit = 0;.  pN
23d60 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b  ew->pOffset = 0;
23d70 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
23d80 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
23d90 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23da0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23db0 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20   term pFrom has 
23dc0 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
23dd0 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e  ction.** argumen
23de0 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ts.  If it does,
23df0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
23e00 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
23e10 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  e and return.** 
23e20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20  non-zero, since 
23e30 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c  pFrom is not all
23e40 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62  owed to be a tab
23e50 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
23e60 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
23e70 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  t cannotBeFuncti
23e80 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
23e90 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
23ea0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
23eb0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
23ec0 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
23ed0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23ee0 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73  pParse, "'%s' is
23ef0 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22   not a function"
23f00 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pFrom->zName);
23f10 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
23f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
23f30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23f40 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
23f50 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28  Argument pWith (
23f60 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c  which may be NUL
23f70 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c  L) points to a l
23f80 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65  inked list of ne
23f90 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f  sted .** WITH co
23fa0 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e  ntexts, from inn
23fb0 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e  er to outermost.
23fc0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64   If the table id
23fd0 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  entified by .** 
23fe0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
23ff0 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61  ent pItem is rea
24000 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62  lly a common-tab
24010 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43  le-expression (C
24020 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74  TE) .** then ret
24030 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24040 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74   the CTE definit
24050 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62  ion for that tab
24060 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  le. Otherwise.**
24070 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
24080 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c  .** If a non-NUL
24090 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  L value is retur
240a0 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74  ned, set *ppCont
240b0 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ext to point to 
240c0 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65  the With.** obje
240d0 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ct that the retu
240e0 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73  rned CTE belongs
240f0 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73   to..*/.static s
24100 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63  truct Cte *searc
24110 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70  hWith(.  With *p
24120 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
24130 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
24140 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49  ent innermost WI
24150 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  TH clause */.  s
24160 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24170 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f  em *pItem,     /
24180 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
24190 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65  ement to resolve
241a0 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43   */.  With **ppC
241b0 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20  ontext          
241c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49        /* OUT: WI
241d0 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  TH clause return
241e0 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74   value belongs t
241f0 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  o */.){.  const 
24200 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
24210 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
24220 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65  ase==0 && (zName
24230 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29   = pItem->zName)
24240 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  !=0 ){.    With 
24250 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57  *p;.    for(p=pW
24260 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75  ith; p; p=p->pOu
24270 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ter){.      int 
24280 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
24290 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b  ; i<p->nCte; i++
242a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
242b0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
242c0 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  ame, p->a[i].zNa
242d0 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
242e0 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d      *ppContext =
242f0 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   p;.          re
24300 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  turn &p->a[i];. 
24310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24320 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24330 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn 0;.}../* The
24340 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
24350 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63  maintains a stac
24360 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48  k of active WITH
24370 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68   clauses.** with
24380 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
24390 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e  WITH clause bein
243a0 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  g at the top of 
243b0 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
243c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
243d0 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c  shes the WITH cl
243e0 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74  ause passed as t
243f0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
24400 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74  nt.** onto the t
24410 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
24420 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72   If argument bFr
24430 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ee is true, then
24440 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c   this.** WITH cl
24450 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  ause will never 
24460 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  be popped from t
24470 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69  he stack. In thi
24480 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f  s case it.** sho
24490 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f  uld be freed alo
244a0 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73  ng with the Pars
244b0 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68  e object. In oth
244c0 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a  er cases, when.*
244d0 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20  * bFree==0, the 
244e0 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c  With object will
244f0 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
24500 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20  with the SELECT 
24510 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69  .** statement wi
24520 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61  th which it is a
24530 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f  ssociated..*/.vo
24540 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  id sqlite3WithPu
24550 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
24560 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75  , With *pWith, u
24570 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65  8 bFree){.  asse
24580 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20  rt( bFree==0 || 
24590 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d  (pParse->pWith==
245a0 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69  0 && pParse->pWi
245b0 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a  thToFree==0) );.
245c0 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
245d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
245e0 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20  e->pWith!=pWith 
245f0 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f  );.    pWith->pO
24600 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70  uter = pParse->p
24610 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
24620 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
24630 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
24640 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f   pParse->pWithTo
24650 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20  Free = pWith;.  
24660 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
24670 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
24680 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f  if argument pFro
24690 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54  m refers to a CT
246a0 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a  E declared by .*
246b0 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20  * a WITH clause 
246c0 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72  on the stack cur
246d0 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65  rently maintaine
246e0 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
246f0 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72   And,.** if curr
24700 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
24710 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f   a CTE expressio
24720 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  n, if it is a re
24730 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72  cursive.** refer
24740 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72  ence to the curr
24750 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49  ent CTE..**.** I
24760 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e  f pFrom falls in
24770 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  to either of the
24780 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20   two categories 
24790 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54  above, pFrom->pT
247a0 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  ab.** and other 
247b0 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c  fields are popul
247c0 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
247d0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  . The caller sho
247e0 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46  uld check.** (pF
247f0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f  rom->pTab!=0) to
24800 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
24810 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63  er or not a succ
24820 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20  essful match.** 
24830 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  was found..**.**
24840 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
24850 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
24860 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
24870 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
24880 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49  ror.** occurs. I
24890 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
248a0 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20  occur, an error 
248b0 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65  message is store
248c0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73  d in the.** pars
248d0 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f  er and some erro
248e0 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
248f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  n SQLITE_OK retu
24900 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
24910 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a  int withExpand(.
24920 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65    Walker *pWalke
24930 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63  r, .  struct Src
24940 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
24950 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
24960 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
24970 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
24980 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
24990 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20  b;.  struct Cte 
249a0 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20  *pCte;          
249b0 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20       /* Matched 
249c0 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20  CTE (or NULL if 
249d0 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57  no match) */.  W
249e0 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20  ith *pWith;     
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a00 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68  * WITH clause th
24a10 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20  at pCte belongs 
24a20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
24a30 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
24a40 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61  );..  pCte = sea
24a50 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e  rchWith(pParse->
24a60 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70  pWith, pFrom, &p
24a70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74  With);.  if( pCt
24a80 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  e ){.    Table *
24a90 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69  pTab;.    ExprLi
24aa0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
24ab0 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
24ac0 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b    Select *pLeft;
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  /* Left-most SEL
24af0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
24b00 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63  .    int bMayRec
24b10 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20  ursive;         
24b20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
24b30 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79  mpound joined by
24b40 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a   UNION [ALL] */.
24b50 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64      With *pSaved
24b60 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
24b70 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
24b80 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57  ue of pParse->pW
24b90 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ith */..    /* I
24ba0 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  f pCte->zCteErr 
24bb0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74  is non-NULL at t
24bc0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
24bd0 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67  this is an illeg
24be0 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73  al.    ** recurs
24bf0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ive reference to
24c00 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65   CTE pCte. Leave
24c10 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
24c20 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  rse and return. 
24c30 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20     ** early. If 
24c40 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73  pCte->zCteErr is
24c50 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
24c60 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
24c70 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20  ive reference.. 
24c80 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
24c90 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f  se, proceed.  */
24ca0 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a  .    if( pCte->z
24cb0 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20  CteErr ){.      
24cc0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24cd0 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43  pParse, pCte->zC
24ce0 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61  teErr, pCte->zNa
24cf0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
24d00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
24d10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61      }.    if( ca
24d20 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70  nnotBeFunction(p
24d30 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20  Parse, pFrom) ) 
24d40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24d50 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ROR;..    assert
24d60 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
24d70 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70   );.    pFrom->p
24d80 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
24d90 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
24da0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
24db0 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  e));.    if( pTa
24dc0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
24dd0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61  C_Abort;.    pTa
24de0 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
24df0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
24e00 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
24e10 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  p(db, pCte->zNam
24e20 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50  e);.    pTab->iP
24e30 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54  Key = -1;.    pT
24e40 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
24e50 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
24e60 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
24e70 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20  (1048576) );.   
24e80 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
24e90 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20  |= TF_Ephemeral 
24ea0 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f  | TF_NoVisibleRo
24eb0 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  wid;.    pFrom->
24ec0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
24ed0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
24ee0 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Cte->pSelect, 0)
24ef0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
24f00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
24f10 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
24f20 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
24f30 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
24f40 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  t );..    /* Che
24f50 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ck if this is a 
24f60 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a  recursive CTE. *
24f70 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72  /.    pSel = pFr
24f80 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
24f90 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d   bMayRecursive =
24fa0 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f   ( pSel->op==TK_
24fb0 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d  ALL || pSel->op=
24fc0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
24fd0 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
24fe0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ve ){.      int 
24ff0 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74  i;.      SrcList
25000 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e   *pSrc = pFrom->
25010 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
25020 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
25030 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
25040 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
25050 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25060 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Item = &pSrc->a[
25070 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
25080 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
25090 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
250a0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
250b0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d   .         && 0=
250c0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
250d0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43  pItem->zName, pC
250e0 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20  te->zName).     
250f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
25100 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20    pItem->pTab = 
25110 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
25120 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pItem->fg.isRecu
25130 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20  rsive = 1;.     
25140 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
25150 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
25160 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSel->selFlags |
25170 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a  = SF_Recursive;.
25180 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25190 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
251a0 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69  Only one recursi
251b0 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ve reference is 
251c0 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20  permitted. */ . 
251d0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61     if( pTab->nTa
251e0 62 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20  bRef>2 ){.      
251f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25200 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
25210 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66  e, "multiple ref
25220 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72  erences to recur
25230 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c  sive table: %s",
25240 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pCte->zName.   
25250 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75     );.      retu
25260 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
25270 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
25280 74 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  t( pTab->nTabRef
25290 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73  ==1 || ((pSel->s
252a0 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72  elFlags&SF_Recur
252b0 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e  sive) && pTab->n
252c0 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20  TabRef==2 ));.. 
252d0 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
252e0 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
252f0 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
25300 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
25310 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
25320 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
25330 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20   pWith;.    if( 
25340 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
25350 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
25360 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50  Prior = pSel->pP
25370 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65  rior;.      asse
25380 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74  rt( pPrior->pWit
25390 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
253a0 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53  rior->pWith = pS
253b0 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20  el->pWith;.     
253c0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
253d0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69  ct(pWalker, pPri
253e0 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  or);.      pPrio
253f0 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20  r->pWith = 0;.  
25400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
25410 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
25420 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
25430 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
25440 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
25450 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74  ;..    for(pLeft
25460 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50  =pSel; pLeft->pP
25470 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66  rior; pLeft=pLef
25480 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  t->pPrior);.    
25490 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e  pEList = pLeft->
254a0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
254b0 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20  pCte->pCols ){. 
254c0 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20       if( pEList 
254d0 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
254e0 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  !=pCte->pCols->n
254f0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
25500 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25510 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
25520 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20  s has %d values 
25530 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
25540 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74  .            pCt
25550 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74  e->zName, pEList
25560 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70  ->nExpr, pCte->p
25570 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20  Cols->nExpr.    
25580 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
25590 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
255a0 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20  SavedWith;.     
255b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
255c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
255d0 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
255e0 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20  Cte->pCols;.    
255f0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  }..    sqlite3Co
25600 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
25610 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
25620 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
25630 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
25640 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
25650 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
25660 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
25670 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
25680 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
25690 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70  CteErr = "multip
256a0 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  le recursive ref
256b0 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20  erences: %s";.  
256c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
256d0 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
256e0 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65   = "recursive re
256f0 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62  ference in a sub
25700 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20  query: %s";.    
25710 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
25720 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
25730 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
25740 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  }.    pCte->zCte
25750 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Err = 0;.    pPa
25760 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
25770 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20  vedWith;.  }..  
25780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25790 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
257a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
257b0 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CTE./*.** If the
257c0 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61   SELECT passed a
257d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
257e0 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73  ument has an ass
257f0 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a  ociated WITH .**
25800 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20   clause, pop it 
25810 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73  from the stack s
25820 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
25830 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
25840 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
25850 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
25860 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  s the xSelectCal
25870 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63  lback2() callbac
25880 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53  k by.** sqlite3S
25890 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68  electExpand() wh
258a0 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c  en walking a SEL
258b0 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f  ECT tree to reso
258c0 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  lve table.** nam
258d0 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f  es and other FRO
258e0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
258f0 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
25900 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  id selectPopWith
25910 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
25920 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
25930 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
25940 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
25950 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
25960 57 69 74 68 20 26 26 20 70 2d 3e 70 50 72 69 6f  With && p->pPrio
25970 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68  r==0 ){.    With
25980 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69   *pWith = findRi
25990 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
259a0 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74 68  h;.    if( pWith
259b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
259c0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
259d0 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th==pWith );.   
259e0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
259f0 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72   = pWith->pOuter
25a00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
25a10 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65  lse.#define sele
25a20 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64  ctPopWith 0.#end
25a30 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
25a40 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
25a50 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
25a60 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
25a70 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
25a80 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
25a90 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
25aa0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
25ab0 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
25ac0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
25ad0 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
25ae0 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
25af0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
25b00 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
25b10 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
25b20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
25b30 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
25b40 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
25b50 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
25b60 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
25b70 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
25b80 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
25b90 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
25ba0 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
25bb0 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
25bc0 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
25bd0 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
25be0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
25bf0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
25c00 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
25c10 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
25c20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
25c30 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
25c40 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
25c50 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
25c60 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
25c70 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
25c80 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
25c90 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
25ca0 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
25cb0 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74  g up the persist
25cc0 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
25cd0 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
25ce0 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
25cf0 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
25d00 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
25d10 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d  clause to accomm
25d20 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
25d30 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
25d40 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
25d50 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
25d60 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
25d70 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
25d80 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
25d90 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
25da0 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
25db0 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
25dc0 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
25dd0 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
25de0 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
25df0 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
25e00 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
25e10 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
25e20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
25e30 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
25e40 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
25e50 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
25e60 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
25e70 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
25e80 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
25e90 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
25ea0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
25eb0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
25ec0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
25ed0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
25ee0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
25ef0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
25f00 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
25f10 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
25f20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
25f30 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
25f40 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
25f50 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52  .  Expr *pE, *pR
25f60 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20  ight, *pExpr;.  
25f70 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70  u16 selFlags = p
25f80 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70  ->selFlags;..  p
25f90 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
25fa0 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28  _Expanded;.  if(
25fb0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
25fc0 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
25fd0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
25fe0 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
25ff0 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46  Src==0) || (selF
26000 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
26010 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
26020 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
26030 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
26040 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
26050 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
26060 20 20 69 66 28 20 70 2d 3e 70 57 69 74 68 20 29    if( p->pWith )
26070 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74  {.    sqlite3Wit
26080 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d  hPush(pParse, p-
26090 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a  >pWith, 0);.  }.
260a0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
260b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
260c0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
260d0 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
260e0 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
260f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
26100 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
26110 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
26120 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
26130 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
26140 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
26150 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
26160 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
26170 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
26180 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
26190 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
261a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
261b0 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
261c0 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
261d0 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
261e0 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
261f0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
26200 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
26210 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
26220 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
26230 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
26240 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
26250 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
26260 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
26270 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
26280 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
26290 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72  ursive==0 || pFr
262a0 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20  om->pTab!=0 );. 
262b0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67     if( pFrom->fg
262c0 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63  .isRecursive ) c
262d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
262e0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
262f0 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
26300 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
26310 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e     if( withExpan
26320 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  d(pWalker, pFrom
26330 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
26340 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46  bort;.    if( pF
26350 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65  rom->pTab ) {} e
26360 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
26370 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
26380 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
26390 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
263a0 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
263b0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
263c0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
263d0 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
263e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
263f0 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
26400 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
26410 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
26420 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
26430 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b==0 );.      if
26440 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c  ( sqlite3WalkSel
26450 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
26460 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  l) ) return WRC_
26470 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46 72  Abort;.      pFr
26480 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
26490 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
264a0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
264b0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
264c0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
264d0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
264e0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
264f0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
26500 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
26510 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
26520 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20  "sqlite_sq_%p", 
26530 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
26540 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
26550 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
26560 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
26570 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  }.      sqlite3C
26580 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
26590 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
265a0 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
265b0 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
265c0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
265d0 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Key = -1;.      
265e0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
265f0 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
26600 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
26610 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
26620 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
26630 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
26640 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
26650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
26660 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
26670 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
26680 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
26690 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
266a0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
266b0 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
266c0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
266d0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
266e0 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
266f0 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
26700 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
26710 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26720 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
26730 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20  nTabRef>=0xffff 
26740 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26750 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26760 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
26770 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
26780 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
26790 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
267a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
267b0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
267c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
267d0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
267e0 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
267f0 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
26800 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
26810 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65  Tab) && cannotBe
26820 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
26830 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
26840 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
26850 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ort;.      }.#if
26860 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
26870 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
26880 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
26890 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
268a0 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  E).      if( IsV
268b0 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20  irtual(pTab) || 
268c0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
268d0 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f  .        i16 nCo
268e0 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  l;.        if( s
268f0 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
26900 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
26910 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
26920 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26930 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26940 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
26950 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
26960 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
26970 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
26980 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ab->pSelect, 0);
26990 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
269a0 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46  SelectSetName(pF
269b0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54  rom->pSelect, pT
269c0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
269d0 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d      nCol = pTab-
269e0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
269f0 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  Tab->nCol = -1;.
26a00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
26a10 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
26a20 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
26a30 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  t);.        pTab
26a40 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
26a50 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
26a60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
26a70 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
26a80 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
26a90 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
26aa0 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
26ab0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
26ac0 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
26ad0 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
26ae0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26af0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26b00 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
26b10 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
26b20 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
26b30 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
26b40 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
26b50 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
26b60 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
26b70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
26b80 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26b90 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
26ba0 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
26bb0 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
26bc0 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
26bd0 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
26be0 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
26bf0 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
26c00 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
26c10 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
26c20 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
26c30 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
26c40 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
26c50 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
26c60 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
26c70 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
26c80 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f  ASTERISK operato
26c90 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
26ca0 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
26cb0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  the column.  ** 
26cc0 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  list.  The follo
26cd0 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
26ce0 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
26cf0 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a   TK_ASTERISK.  *
26d00 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  * expressions an
26d10 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e  d expand each on
26d20 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
26d30 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a   all columns in.
26d40 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e    ** all tables.
26d50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
26d60 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
26d70 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
26d80 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
26d90 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
26da0 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
26db0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
26dc0 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
26dd0 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
26de0 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
26df0 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
26e00 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ( pE->op==TK_AST
26e10 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
26e20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
26e30 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
26e40 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
26e50 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
26e60 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
26e70 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
26e80 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
26e90 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
26ea0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
26eb0 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
26ec0 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
26ed0 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
26ee0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
26ef0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
26f00 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
26f10 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
26f20 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
26f30 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
26f40 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
26f50 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
26f60 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
26f70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
26f80 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
26f90 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
26fa0 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
26fb0 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
26fc0 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
26fd0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
26fe0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
26ff0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
27000 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
27010 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
27020 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
27030 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
27040 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
27050 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27070 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
27080 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
27090 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
270a0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
270b0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
270c0 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70       pE = a[k].p
270d0 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67  Expr;.      pRig
270e0 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
270f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27100 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
27110 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
27120 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
27130 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
27140 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
27150 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
27160 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
27170 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
27180 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
27190 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
271a0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
271b0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
271c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
271d0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
271e0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
271f0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
27200 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
27210 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
27220 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
27230 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
27240 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
27250 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
27260 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
27270 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
27280 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
27290 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
272a0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
272b0 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
272c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
272d0 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
272e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
272f0 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
27300 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
27310 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
27320 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
27330 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
27340 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
27350 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
27360 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
27370 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
27380 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
27390 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
273a0 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
273b0 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
273c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
273d0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
273e0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
273f0 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
27400 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
27410 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
27420 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
27430 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
27440 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
27450 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
27460 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
27470 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
27480 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
27490 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
274a0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
274b0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
274c0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
274d0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
274e0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
274f0 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
27500 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
27510 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
27520 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
27530 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
27540 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
27550 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
27560 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
27570 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
27580 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
27590 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
275a0 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
275b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
275c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
275d0 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
275e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
275f0 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
27600 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
27610 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
27620 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
27630 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27640 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
27650 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
27660 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
27670 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
27680 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
27690 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
276a0 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
276b0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
276c0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
276d0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
276e0 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
276f0 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
27700 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
27710 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
27720 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
27730 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
27740 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
27750 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
27760 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
27770 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
27780 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
27790 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
277a0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
277b0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
277c0 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
277d0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
277e0 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
277f0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
27800 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
27810 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
27820 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
27830 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
27840 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
27850 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
27860 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27870 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
27890 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
278a0 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
278b0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
278c0 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
278d0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
278f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
27900 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
27910 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
27920 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
27930 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
27940 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
27950 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
27960 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
27970 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
27980 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
27990 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
279a0 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
279b0 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
279c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
279d0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
279e0 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
279f0 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
27a00 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
27a10 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
27a20 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
27a30 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
27a40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
27a50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27a60 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
27a70 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
27a80 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
27a90 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
27aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
27ab0 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
27ac0 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
27ad0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
27ae0 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
27af0 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
27b00 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
27b10 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
27b20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
27b30 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
27b40 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
27b50 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
27b60 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
27b70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
27b80 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
27b90 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27bd0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
27be0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
27bf0 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
27c00 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
27c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27c20 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
27c30 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
27c40 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
27c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27c60 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
27c70 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
27c80 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
27c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27ca0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
27cb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27cd0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
27ce0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
27cf0 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
27d00 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
27d10 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
27d20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
27d30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
27d40 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
27d50 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
27d60 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
27d70 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
27d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
27d90 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
27da0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
27db0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
27dc0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
27dd0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
27de0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
27df0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
27e00 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
27e10 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
27e20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
27e30 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
27e40 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
27e50 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
27e60 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
27e70 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
27e80 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
27e90 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  eft, pExpr);.   
27ea0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27eb0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
27ec0 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
27ee0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
27ef0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
27f00 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
27f10 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
27f20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
27f30 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
27f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27f50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27f60 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
27f70 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
27f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27f90 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
27fa0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
27fb0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
27fc0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
27fd0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
27fe0 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
27ff0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
28000 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28010 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
28020 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
28030 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
28040 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
28050 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
28060 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
28070 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28080 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
28090 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
280a0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
280b0 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
280c0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
280d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
280e0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
280f0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
28100 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
28110 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
28130 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
28140 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
28150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28160 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
28170 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
28180 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
28190 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281c0 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
281d0 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
281e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
281f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
28200 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
28210 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28220 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
28230 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
28240 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28250 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28260 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
28270 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
28280 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28290 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
282a0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
282b0 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
282c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
282d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
282e0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
282f0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
28300 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
28310 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28320 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28330 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
28340 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
28350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28360 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28370 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
28380 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
28390 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
283a0 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
283b0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
283c0 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
283d0 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
283e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
283f0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
28400 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
28410 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28420 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
28430 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
28440 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
28450 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
28460 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rt;.  }.#endif. 
28470 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28480 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
28490 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
284a0 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
284b0 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
284c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
284d0 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
284e0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
284f0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
28500 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
28510 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
28520 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
28530 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
28540 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
28550 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
28560 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
28570 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
28580 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
28590 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
285a0 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
285b0 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
285c0 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
285d0 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
285e0 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74  ser tree..*/.int
285f0 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
28600 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
28610 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
28620 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
28630 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
28640 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
28650 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28660 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
28670 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
28680 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
28690 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
286a0 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
286b0 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
286c0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
286d0 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
286e0 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
286f0 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
28700 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
28710 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
28720 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
28730 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
28740 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
28750 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
28760 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
28770 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
28780 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
28790 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
287a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
287b0 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
287c0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
287d0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
287e0 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
287f0 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
28800 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
28810 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
28820 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
28830 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
28840 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
28850 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
28860 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
28870 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
28880 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
28890 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
288a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
288b0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
288c0 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
288d0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
288e0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
288f0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
28900 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
28910 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
28920 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
28930 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
28940 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70   pParse;.  if( p
28950 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
28960 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  nd ){.    w.xSel
28970 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
28980 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
28990 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
289a0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
289b0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
289c0 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65  );.  }.  w.xSele
289d0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
289e0 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77  ectExpander;.  w
289f0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
28a00 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74  2 = selectPopWit
28a10 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  h;.  sqlite3Walk
28a20 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
28a30 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
28a40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
28a50 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
28a60 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
28a70 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
28a80 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
28a90 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
28aa0 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
28ab0 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
28ac0 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
28ad0 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
28ae0 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
28af0 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
28b00 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
28b10 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
28b20 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
28b30 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
28b40 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
28b50 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
28b60 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
28b70 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
28b80 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
28b90 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
28ba0 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
28bb0 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
28bc0 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
28bd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
28be0 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
28bf0 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
28c00 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
28c10 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
28c20 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
28c30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
28c40 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
28c50 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
28c60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
28c70 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
28c80 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20  TypeInfo(Walker 
28c90 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
28ca0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
28cb0 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Parse;.  int i;.
28cc0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
28cd0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
28ce0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
28cf0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  m;..  assert( p-
28d00 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
28d10 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73 73  esolved );.  ass
28d20 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
28d30 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
28d40 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73  fo)==0 );.  p->s
28d50 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
28d60 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61  sTypeInfo;.  pPa
28d70 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
28d80 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73  Parse;.  pTabLis
28d90 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66  t = p->pSrc;.  f
28da0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
28db0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
28dc0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
28dd0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
28de0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
28df0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  rom->pTab;.    a
28e00 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
28e10 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
28e20 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
28e30 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a  phemeral)!=0 ){.
28e40 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
28e50 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
28e60 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
28e70 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  ECT */.      Sel
28e80 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
28e90 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
28ea0 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
28eb0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
28ec0 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
28ed0 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
28ee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28ef0 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
28f00 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
28f10 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
28f20 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
28f30 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
28f40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28f50 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79  tine adds dataty
28f60 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  pe and collating
28f70 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d   sequence inform
28f80 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20  ation to.** the 
28f90 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73  Table structures
28fa0 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   of all FROM-cla
28fb0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69  use subqueries i
28fc0 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  n a.** SELECT st
28fd0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55  atement..**.** U
28fe0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
28ff0 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
29000 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
29010 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
29020 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50  ectAddTypeInfo(P
29030 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
29040 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
29050 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29060 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57  MIT_SUBQUERY.  W
29070 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
29080 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
29090 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  w));.  w.xSelect
290a0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
290b0 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
290c0 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
290d0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
290e0 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
290f0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
29100 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
29110 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
29120 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lect);.#endif.}.
29130 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
29140 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53  tine sets up a S
29150 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
29160 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  for processing. 
29170 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
29180 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65  g is accomplishe
29190 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  d:.**.**     *  
291a0 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62  VDBE Cursor numb
291b0 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64  ers are assigned
291c0 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   to all FROM-cla
291d0 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20  use terms..**   
291e0 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54    *  Ephemeral T
291f0 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65  able objects are
29200 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
29210 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
29220 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20  queries..**     
29230 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  *  ON and USING 
29240 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66  clauses are shif
29250 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73  ted into WHERE s
29260 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20  tatements.**    
29270 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a   *  Wildcards "*
29280 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20  " and "TABLE.*" 
29290 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61  in result sets a
292a0 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20  re expanded..** 
292b0 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65      *  Identifie
292c0 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  rs in expression
292d0 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20   are matched to 
292e0 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
292f0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
29300 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61  recursively on a
29310 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69  ll subqueries wi
29320 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e  thin the SELECT.
29330 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
29340 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61  SelectPrep(.  Pa
29350 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
29360 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
29370 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
29380 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
29390 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
293a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
293b0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
293c0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
293d0 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
293e0 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74  context for cont
293f0 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  ainer */.){.  sq
29400 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
29410 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
29420 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50  eturn;.  db = pP
29430 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
29440 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29450 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
29460 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
29470 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
29480 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
29490 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
294a0 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
294b0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
294c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
294d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
294e0 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
294f0 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
29500 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
29510 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
29520 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
29530 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
29540 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
29550 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
29560 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
29570 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
29580 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
29590 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
295a0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
295b0 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
295c0 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
295d0 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
295e0 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
295f0 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
29600 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
29610 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
29620 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73  ates code that s
29630 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
29640 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
29650 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  ry.** cells..*/.
29660 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
29670 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
29680 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
29690 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
296a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
296b0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
296c0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
296d0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
296e0 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70  ;.  int nReg = p
296f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b  AggInfo->nFunc +
29700 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75   pAggInfo->nColu
29710 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  mn;.  if( nReg==
29720 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  0 ) return;.#ifd
29730 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29740 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
29750 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67   all AggInfo reg
29760 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69  isters are withi
29770 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63  n the range spec
29780 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67  ified by.  ** Ag
29790 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67  gInfo.mnReg..Agg
297a0 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20  Info.mxReg */.  
297b0 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41  assert( nReg==pA
297c0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41  ggInfo->mxReg-pA
297d0 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20  ggInfo->mnReg+1 
297e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
297f0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
29800 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  n; i++){.    ass
29810 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
29820 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  Col[i].iMem>=pAg
29830 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
29840 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
29850 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c  o->aCol[i].iMem<
29860 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
29870 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   );.  }.  for(i=
29880 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
29890 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
298a0 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
298b0 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e  ->aFunc[i].iMem>
298c0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
298d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
298e0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
298f0 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
29900 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e  mxReg );.  }.#en
29910 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dif.  sqlite3Vdb
29920 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
29930 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
29940 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f  >mnReg, pAggInfo
29950 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28  ->mxReg);.  for(
29960 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
29970 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
29980 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
29990 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
299a0 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
299b0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
299c0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
299d0 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
299e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
299f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
29a00 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
29a10 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
29a20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
29a30 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
29a40 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
29a50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
29a60 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
29a70 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
29a80 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
29a90 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
29aa0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
29ab0 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
29ac0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
29ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
29ae0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
29af0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
29b00 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
29b10 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29  ->x.pList, 0, 0)
29b20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29b30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
29b40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
29b50 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
29b60 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
29b90 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
29ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29bb0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
29bc0 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
29bd0 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
29be0 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
29bf0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
29c00 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
29c10 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
29c20 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
29c30 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
29c40 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
29c50 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
29c60 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
29c70 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
29c80 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
29c90 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
29ca0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
29cb0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
29cc0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
29cd0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
29ce0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
29cf0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
29d00 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
29d10 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29d20 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
29d30 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
29d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29d50 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op2(v, OP_AggFin
29d60 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
29d70 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
29d80 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c  pr : 0);.    sql
29d90 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
29da0 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50  (v, pF->pFunc, P
29db0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
29dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
29dd0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
29de0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
29df0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
29e00 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
29e10 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
29e20 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
29e30 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
29e40 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
29e50 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
29e60 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
29e70 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
29e80 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
29e90 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b   int regHit = 0;
29ea0 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65  .  int addrHitTe
29eb0 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
29ec0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
29ed0 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
29ee0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
29ef0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
29f00 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
29f10 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
29f20 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
29f30 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
29f40 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
29f50 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
29f60 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
29f70 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
29f80 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
29f90 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
29fa0 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
29fb0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
29fc0 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
29fd0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
29fe0 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
29ff0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
2a000 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
2a010 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
2a020 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
2a030 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
2a040 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2a050 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2a060 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
2a070 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  , 0, SQLITE_ECEL
2a080 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
2a090 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
2a0a0 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
2a0b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
2a0c0 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
2a0d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
2a0e0 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
2a0f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2a100 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2a110 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45  nArg==0 );  /* E
2a120 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
2a130 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
2a140 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a  ( nArg>1 );   /*
2a150 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a   Also an error *
2a160 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  /.      codeDist
2a170 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
2a180 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
2a190 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
2a1a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a1b0 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  pF->pFunc->funcF
2a1c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2a1d0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
2a1e0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2a1f0 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
2a200 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2a210 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
2a220 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
2a230 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
2a240 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
2a250 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
2a260 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
2a270 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
2a280 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
2a290 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
2a2a0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2a2b0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2a2c0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2a2d0 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
2a2e0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
2a2f0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2a300 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
2a310 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
2a320 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2a330 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48  }.      if( regH
2a340 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66  it==0 && pAggInf
2a350 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
2a360 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61  ) regHit = ++pPa
2a370 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2a380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a390 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
2a3a0 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20  , regHit, 0, 0, 
2a3b0 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
2a3c0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
2a3d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
2a3e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67  eAddOp3(v, OP_Ag
2a3f0 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67  gStep0, 0, regAg
2a400 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20  g, pF->iMem);.  
2a410 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
2a420 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
2a430 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
2a440 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a450 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
2a460 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
2a470 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
2a480 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
2a490 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
2a4a0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2a4b0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
2a4c0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2a4d0 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
2a4e0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
2a4f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2a500 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
2a510 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2a520 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2a530 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
2a540 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
2a550 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61  populating the a
2a560 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
2a570 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ters, clear the 
2a580 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
2a590 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
2a5a0 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75   any of the requ
2a5b0 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ired column valu
2a5c0 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  es are already p
2a5d0 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20  resent .  ** in 
2a5e0 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74  registers, sqlit
2a5f0 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79  e3ExprCode() may
2a600 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f   use OP_SCopy to
2a610 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a   copy the value.
2a620 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d    ** to pC->iMem
2a630 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d  . But by the tim
2a640 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75  e the value is u
2a650 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  sed, the origina
2a660 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20  l register.  ** 
2a670 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73  may have been us
2a680 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  ed, invalidating
2a690 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
2a6a0 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74  buffer holding t
2a6b0 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20  he.  ** text or 
2a6c0 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20  blob value. See 
2a6d0 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63  ticket [883034dc
2a6e0 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  b5]..  **.  ** A
2a6f0 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20  nother solution 
2a700 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e  would be to chan
2a710 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20  ge the OP_SCopy 
2a720 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63  used to copy cac
2a730 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  hed.  ** values 
2a740 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20  to an OP_Copy.. 
2a750 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74   */.  if( regHit
2a760 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54   ){.    addrHitT
2a770 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
2a780 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
2a790 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43  , regHit); VdbeC
2a7a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
2a7b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2a7c0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2a7d0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
2a7e0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
2a7f0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
2a800 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
2a810 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
2a820 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2a830 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
2a840 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
2a850 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
2a860 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
2a870 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2a880 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64  Parse);.  if( ad
2a890 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
2a8a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2a8b0 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
2a8c0 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
2a8d0 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
2a8e0 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
2a8f0 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
2a900 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
2a910 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
2a920 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
2a930 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2a940 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
2a950 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2a960 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
2a970 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
2a980 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
2a990 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2a9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2a9b0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
2a9c0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
2a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a9e0 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
2a9f0 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
2aa00 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
2aa10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2aa20 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
2aa30 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
2aa40 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
2aa50 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
2aa60 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f  2 ){.    int bCo
2aa70 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26  ver = (pIdx!=0 &
2aa80 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
2aa90 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
2aaa0 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b  eyIndex(pIdx)));
2aab0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20  .    char *zEqp 
2aac0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
2aad0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43  (pParse->db, "SC
2aae0 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22  AN TABLE %s%s%s"
2aaf0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
2ab00 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62  zName,.        b
2ab10 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20  Cover ? " USING 
2ab20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22  COVERING INDEX "
2ab30 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62   : "",.        b
2ab40 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e  Cover ? pIdx->zN
2ab50 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a  ame : "".    );.
2ab60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ab70 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70  ddOp4(.        p
2ab80 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
2ab90 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
2aba0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
2abb0 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41  0, zEqp, P4_DYNA
2abc0 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  MIC.    );.  }.}
2abd0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2abe0 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
2abf0 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  nt(a,b,c).#endif
2ac00 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20  ../*.** Context 
2ac10 6f 62 6a 65 63 74 20 66 6f 72 20 68 61 76 69 6e  object for havin
2ac20 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28 29  gToWhereExprCb()
2ac30 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 48 61 76 69  ..*/.struct Havi
2ac40 6e 67 54 6f 57 68 65 72 65 43 74 78 20 7b 0a 20  ngToWhereCtx {. 
2ac50 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 3b   Expr **ppWhere;
2ac60 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
2ac70 6f 75 70 42 79 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  oupBy;.};../*.**
2ac80 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2ac90 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  () callback used
2aca0 20 62 79 20 68 61 76 69 6e 67 54 6f 57 68 65 72   by havingToWher
2acb0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
2acc0 65 20 6e 6f 64 65 20 70 61 73 73 65 64 20 74 6f  e node passed to
2acd0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73   the callback is
2ace0 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20   a TK_AND node, 
2acf0 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43  return .** WRC_C
2ad00 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20  ontinue to tell 
2ad10 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2ad20 29 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  ) to iterate thr
2ad30 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f 64 65 73  ough child nodes
2ad40 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
2ad50 65 2c 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72  e, return WRC_Pr
2ad60 75 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  une. In this cas
2ad70 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20 69 66  e, also check if
2ad80 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70   the .** sub-exp
2ad90 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
2ada0 74 68 65 20 63 72 69 74 65 72 69 61 20 66 6f 72  the criteria for
2adb0 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20   being moved to 
2adc0 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61  the WHERE.** cla
2add0 75 73 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20  use. If so, add 
2ade0 69 74 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  it to the WHERE 
2adf0 63 6c 61 75 73 65 20 61 6e 64 20 72 65 70 6c 61  clause and repla
2ae00 63 65 20 74 68 65 20 73 75 62 2d 65 78 70 72 65  ce the sub-expre
2ae10 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20  ssion.** within 
2ae20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65  the HAVING expre
2ae30 73 73 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e  ssion with a con
2ae40 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74  stant "1"..*/.st
2ae50 61 74 69 63 20 69 6e 74 20 68 61 76 69 6e 67 54  atic int havingT
2ae60 6f 57 68 65 72 65 45 78 70 72 43 62 28 57 61 6c  oWhereExprCb(Wal
2ae70 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2ae80 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
2ae90 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
2aea0 41 4e 44 20 29 7b 0a 20 20 20 20 73 74 72 75 63  AND ){.    struc
2aeb0 74 20 48 61 76 69 6e 67 54 6f 57 68 65 72 65 43  t HavingToWhereC
2aec0 74 78 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d  tx *p = pWalker-
2aed0 3e 75 2e 70 48 61 76 69 6e 67 43 74 78 3b 0a 20  >u.pHavingCtx;. 
2aee0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2aef0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
2af00 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70  oupBy(pWalker->p
2af10 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 2d  Parse, pExpr, p-
2af20 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20  >pGroupBy) ){.  
2af30 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
2af40 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
2af50 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78 70  e->db;.      Exp
2af60 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
2af70 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
2af80 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
2af90 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c  te3IntTokens[1],
2afa0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
2afb0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 45  New ){.        E
2afc0 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 2a 28  xpr *pWhere = *(
2afd0 70 2d 3e 70 70 57 68 65 72 65 29 3b 0a 20 20 20  p->ppWhere);.   
2afe0 20 20 20 20 20 53 57 41 50 28 45 78 70 72 2c 20       SWAP(Expr, 
2aff0 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a  *pNew, *pExpr);.
2b000 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
2b010 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
2b020 2c 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b  , pWhere, pNew);
2b030 0a 20 20 20 20 20 20 20 20 2a 28 70 2d 3e 70 70  .        *(p->pp
2b040 57 68 65 72 65 29 20 3d 20 70 4e 65 77 3b 0a 20  Where) = pNew;. 
2b050 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2b060 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2b070 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
2b080 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2b090 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
2b0a0 65 6c 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66  eligible terms f
2b0b0 72 6f 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63  rom the HAVING c
2b0c0 6c 61 75 73 65 20 6f 66 20 61 20 71 75 65 72 79  lause of a query
2b0d0 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72  , which is.** pr
2b0e0 6f 63 65 73 73 65 64 20 61 66 74 65 72 20 67 72  ocessed after gr
2b0f0 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57  ouping, to the W
2b100 48 45 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69  HERE clause, whi
2b110 63 68 20 69 73 20 70 72 6f 63 65 73 73 65 64 20  ch is processed 
2b120 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69  before.** groupi
2b130 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ng. For example,
2b140 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a   the query:.**.*
2b150 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
2b160 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45  M <tables> WHERE
2b170 20 61 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20   a=? GROUP BY b 
2b180 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63  HAVING b=? AND c
2b190 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20  =?.**.** can be 
2b1a0 72 65 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  rewritten as:.**
2b1b0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
2b1c0 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45  ROM <tables> WHE
2b1d0 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47  RE a=? AND b=? G
2b1e0 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
2b1f0 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72   c=?.**.** A ter
2b200 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20  m of the HAVING 
2b210 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c  expression is el
2b220 69 67 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73  igible for trans
2b230 66 65 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73  fer if it consis
2b240 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f  ts.** entirely o
2b250 66 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20  f constants and 
2b260 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
2b270 20 61 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20   are also GROUP 
2b280 42 59 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a  BY terms that.**
2b290 20 75 73 65 20 74 68 65 20 22 42 49 4e 41 52 59   use the "BINARY
2b2a0 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  " collation sequ
2b2b0 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
2b2c0 76 6f 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65  void havingToWhe
2b2d0 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
2b2e0 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
2b2f0 2a 70 47 72 6f 75 70 42 79 2c 0a 20 20 45 78 70  *pGroupBy,.  Exp
2b300 72 20 2a 70 48 61 76 69 6e 67 2c 20 0a 20 20 45  r *pHaving, .  E
2b310 78 70 72 20 2a 2a 70 70 57 68 65 72 65 0a 29 7b  xpr **ppWhere.){
2b320 0a 20 20 73 74 72 75 63 74 20 48 61 76 69 6e 67  .  struct Having
2b330 54 6f 57 68 65 72 65 43 74 78 20 73 43 74 78 3b  ToWhereCtx sCtx;
2b340 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65  .  Walker sWalke
2b350 72 3b 0a 0a 20 20 73 43 74 78 2e 70 70 57 68 65  r;..  sCtx.ppWhe
2b360 72 65 20 3d 20 70 70 57 68 65 72 65 3b 0a 20 20  re = ppWhere;.  
2b370 73 43 74 78 2e 70 47 72 6f 75 70 42 79 20 3d 20  sCtx.pGroupBy = 
2b380 70 47 72 6f 75 70 42 79 3b 0a 0a 20 20 6d 65 6d  pGroupBy;..  mem
2b390 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c  set(&sWalker, 0,
2b3a0 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29   sizeof(sWalker)
2b3b0 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61  );.  sWalker.pPa
2b3c0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2b3d0 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c  sWalker.xExprCal
2b3e0 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f  lback = havingTo
2b3f0 57 68 65 72 65 45 78 70 72 43 62 3b 0a 20 20 73  WhereExprCb;.  s
2b400 57 61 6c 6b 65 72 2e 75 2e 70 48 61 76 69 6e 67  Walker.u.pHaving
2b410 43 74 78 20 3d 20 26 73 43 74 78 3b 0a 20 20 73  Ctx = &sCtx;.  s
2b420 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2b430 73 57 61 6c 6b 65 72 2c 20 70 48 61 76 69 6e 67  sWalker, pHaving
2b440 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
2b450 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2b460 70 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70  pThis entry of p
2b470 54 61 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c  TabList is a sel
2b480 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f  f-join of a prio
2b490 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74  r view..** If it
2b4a0 20 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e   is, then return
2b4b0 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65   the SrcList_ite
2b4c0 6d 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20  m for the prior 
2b4d0 76 69 65 77 2e 20 20 49 66 20 69 74 20 69 73 20  view.  If it is 
2b4e0 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  not,.** then ret
2b4f0 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
2b500 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2b510 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e  item *isSelfJoin
2b520 56 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20  View(.  SrcList 
2b530 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
2b540 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
2b550 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e  or self-joins in
2b560 20 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73   this FROM claus
2b570 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
2b580 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69  cList_item *pThi
2b590 73 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  s   /* Search fo
2b5a0 72 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63  r prior referenc
2b5b0 65 20 74 6f 20 74 68 69 73 20 73 75 62 71 75 65  e to this subque
2b5c0 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ry */.){.  struc
2b5d0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b5e0 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74  pItem;.  for(pIt
2b5f0 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  em = pTabList->a
2b600 3b 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70  ; pItem<pThis; p
2b610 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
2b620 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d   pItem->pSelect=
2b630 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2b640 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2b650 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20  .viaCoroutine ) 
2b660 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2b670 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
2b680 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2b690 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2b6a0 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61  ricmp(pItem->zDa
2b6b0 74 61 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a  tabase, pThis->z
2b6c0 44 61 74 61 62 61 73 65 29 21 3d 30 20 29 20 63  Database)!=0 ) c
2b6d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2b6e0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2b6f0 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70  (pItem->zName, p
2b700 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20  This->zName)!=0 
2b710 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b720 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2b730 6f 6d 70 61 72 65 28 70 54 68 69 73 2d 3e 70 53  ompare(pThis->pS
2b740 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70  elect->pWhere, p
2b750 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
2b760 57 68 65 72 65 2c 20 2d 31 29 20 29 7b 0a 20 20  Where, -1) ){.  
2b770 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20      /* The view 
2b780 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20  was modified by 
2b790 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  some other optim
2b7a0 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a  ization such as.
2b7b0 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77        ** pushDow
2b7c0 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f  nWhereTerms() */
2b7d0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2b7e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2b7f0 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72  n pItem;.  }.  r
2b800 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2b810 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2b820 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73  for the SELECT s
2b830 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69  tatement given i
2b840 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74  n the p argument
2b850 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  .  .**.** The re
2b860 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e  sults are return
2b870 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
2b880 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
2b890 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65  tructure..** See
2b8a0 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c   comments in sql
2b8b0 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72  iteInt.h for fur
2b8c0 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ther information
2b8d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2b8e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
2b8f0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2b900 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
2b910 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
2b920 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
2b930 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
2b940 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
2b950 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
2b960 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
2b970 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
2b980 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
2b990 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
2b9a0 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
2b9b0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2b9c0 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
2b9d0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2b9e0 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
2b9f0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2ba00 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2ba10 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
2ba20 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
2ba30 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
2ba40 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
2ba50 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
2ba60 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
2ba70 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
2ba80 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
2ba90 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
2baa0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2bab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2bac0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
2bad0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2bae0 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
2baf0 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
2bb00 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
2bb10 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
2bb20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
2bb30 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
2bb40 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
2bb50 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
2bb60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2bb70 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
2bb80 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
2bb90 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
2bba0 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20  t *pEList = 0;  
2bbb0 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
2bbc0 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
2bbd0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
2bbe0 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
2bbf0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
2bc00 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
2bc10 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
2bc20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2bc30 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
2bc40 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
2bc50 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
2bc60 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
2bc70 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
2bc80 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
2bc90 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
2bca0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
2bcb0 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
2bcc0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
2bcd0 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
2bce0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
2bcf0 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
2bd00 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
2bd10 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69   DistinctCtx sDi
2bd20 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20  stinct; /* Info 
2bd30 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
2bd40 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
2bd50 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ord */.  SortCtx
2bd60 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20   sSort;         
2bd70 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
2bd80 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52  o code the ORDER
2bd90 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2bda0 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
2bdb0 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
2bdc0 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
2bdd0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
2bde0 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
2bdf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2be00 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
2be10 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
2be20 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
2be30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2be40 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2be50 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ction */..#ifnde
2be60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2be70 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73  PLAIN.  int iRes
2be80 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70  toreSelectId = p
2be90 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2bea0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  ;.  pParse->iSel
2beb0 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
2bec0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b  iNextSelectId++;
2bed0 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20  .#endif..  db = 
2bee0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
2bef0 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
2bf00 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
2bf10 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
2bf20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2bf30 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
2bf40 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
2bf50 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
2bf60 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
2bf70 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
2bf80 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
2bf90 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66  (sAggInfo));.#if
2bfa0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2bfb0 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e  BLED.  pParse->n
2bfc0 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a  SelectIndent++;.
2bfd0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2bfe0 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69  pParse,p, ("begi
2bff0 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22  n processing:\n"
2c000 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ));.  if( sqlite
2c010 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2c020 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x100 ){.    sqli
2c030 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2c040 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
2c050 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2c060 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2c070 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2c080 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  !=SRT_DistFifo )
2c090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2c0a0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2c0b0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2c0c0 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
2c0d0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2c0e0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2c0f0 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  !=SRT_DistQueue 
2c100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2c110 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2c120 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2c130 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20  _Queue );.  if( 
2c140 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
2c150 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61  (pDest) ){.    a
2c160 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
2c170 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
2c180 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2c190 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
2c1a0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2c1b0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
2c1c0 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
2c1d0 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c  t==SRT_Discard |
2c1e0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
2c1f0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51  st->eDest==SRT_Q
2c200 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e  ueue  || pDest->
2c210 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
2c220 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ifo ||.         
2c230 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2c240 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c  SRT_DistQueue ||
2c250 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2c260 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a  RT_Fifo);.    /*
2c270 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
2c280 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
2c290 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
2c2a0 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
2c2b0 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
2c2c0 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
2c2d0 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
2c2e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2c2f0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
2c300 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
2c310 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
2c320 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2c330 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2c340 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
2c350 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
2c360 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  p, 0);.  memset(
2c370 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f  &sSort, 0, sizeo
2c380 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f  f(sSort));.  sSo
2c390 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
2c3a0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
2c3b0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
2c3c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2c3d0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
2c3e0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
2c3f0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2c400 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
2c410 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  >pEList!=0 );.  
2c420 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
2c430 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2c440 61 74 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c  ate)!=0;.#if SEL
2c450 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2c460 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2c470 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2c480 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2c490 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2c4a0 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d  e,p, ("after nam
2c4b0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22  e resolution:\n"
2c4c0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2c4d0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2c4e0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2c4f0 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  if..  /* Try to 
2c500 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
2c510 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2c520 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68  lause up into th
2c530 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a  e main query.  *
2c540 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2c550 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2c560 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2c570 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2c580 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
2c590 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
2c5a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2c5b0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2c5c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2c5d0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2c5e0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
2c5f0 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
2c600 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
2c610 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20 54   isAggSub;.    T
2c620 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
2c630 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
2c640 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2c650 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
2c660 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
2c670 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
2c680 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
2c690 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
2c6a0 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
2c6b0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
2c6c0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
2c6d0 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
2c6e0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
2c6f0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
2c700 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2c710 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
2c720 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
2c730 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
2c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c750 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2c760 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
2c770 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
2c780 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
2c790 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2c7a0 7d 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  }..    isAggSub 
2c7b0 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
2c7c0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2c7d0 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
2c7e0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
2c7f0 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
2c800 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
2c810 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
2c820 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
2c830 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
2c840 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2c850 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
2c860 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
2c870 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
2c880 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
2c890 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
2c8a0 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
2c8b0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
2c8c0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
2c8d0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2c8e0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2c8f0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2c900 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
2c910 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2c920 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2c930 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2c940 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2c950 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  f..  /* Get a po
2c960 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75  inter the VDBE u
2c970 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2c980 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  n, allocating a 
2c990 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a  new VDBE if one.
2c9a0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c    ** does not al
2c9b0 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20  ready exist */. 
2c9c0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
2c9d0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
2c9e0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
2c9f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e  elect_end;..#ifn
2ca00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ca10 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
2ca20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
2ca30 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
2ca40 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
2ca50 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
2ca60 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
2ca70 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
2ca80 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
2ca90 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
2caa0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
2cab0 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c  pDest);.    expl
2cac0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
2cad0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2cae0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2caf0 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  d);.#if SELECTTR
2cb00 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2cb10 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
2cb20 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
2cb30 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
2cb40 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
2cb50 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2cb60 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
2cb70 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  f.    return rc;
2cb80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2cb90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2cba0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
2cbb0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2cbc0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
2cbd0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2cbe0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
2cbf0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
2cc00 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
2cc10 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2cc20 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2cc30 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2cc40 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2cc50 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2cc60 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
2cc70 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
2cc80 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2cc90 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
2cca0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2ccb0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
2ccc0 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
2ccd0 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
2cce0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
2ccf0 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
2cd00 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
2cd10 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
2cd20 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2cd30 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
2cd40 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
2cd50 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
2cd60 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
2cd70 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
2cd80 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
2cd90 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
2cda0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
2cdb0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
2cdc0 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
2cdd0 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
2cde0 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
2cdf0 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
2ce00 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
2ce10 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
2ce20 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
2ce30 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
2ce40 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2ce50 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
2ce60 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2ce70 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2ce80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
2ce90 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65  * The subroutine
2cea0 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20   that manifests 
2ceb0 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20 62  the view might b
2cec0 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75  e a one-time rou
2ced0 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tine,.        **
2cee0 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65   or it might nee
2cef0 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e  d to be rerun on
2cf00 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   each iteration 
2cf10 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20  because it.     
2cf20 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20     ** encodes a 
2cf30 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
2cf40 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ery. */.        
2cf50 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
2cf60 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49  3VdbeGetOp(v, pI
2cf70 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2cf80 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e  )->opcode==OP_On
2cf90 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ce );.        sq
2cfa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2cfb0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74  v, OP_Gosub, pIt
2cfc0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  em->regReturn, p
2cfd0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2cfe0 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
2cff0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2d000 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
2d010 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
2d020 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
2d030 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
2d040 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
2d050 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
2d060 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
2d070 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
2d080 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
2d090 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
2d0a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2d0b0 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
2d0c0 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
2d0d0 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
2d0e0 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
2d0f0 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
2d100 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
2d110 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
2d120 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
2d130 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
2d140 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
2d150 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
2d160 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
2d170 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
2d180 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2d190 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
2d1a0 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
2d1b0 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d   constant WHERE-
2d1c0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20  clause terms in 
2d1d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
2d1e0 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69  down.    ** insi
2d1f0 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  de the subquery.
2d200 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20    This can help 
2d210 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
2d220 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65  run more efficie
2d230 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ntly..    */.   
2d240 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e   if( (pItem->fg.
2d250 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
2d260 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  TER)==0.     && 
2d270 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
2d280 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ms(pParse, pSub,
2d290 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65   p->pWhere, pIte
2d2a0 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20  m->iCursor).    
2d2b0 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ){.#if SELECTTRA
2d2c0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
2d2d0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2d2e0 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2d2f0 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  ){.        SELEC
2d300 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2d310 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48  rse,p,("After WH
2d320 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d  ERE-clause push-
2d330 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  down:\n"));.    
2d340 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2d350 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2d360 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
2d370 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
2d380 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
2d390 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2d3a0 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a  subquery.    **.
2d3b0 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75      ** The subqu
2d3c0 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ery is implement
2d3d0 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
2d3e0 6e 65 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ne if all of the
2d3f0 73 65 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  se are true:.   
2d400 20 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73   **   (1)  The s
2d410 75 62 71 75 65 72 79 20 69 73 20 67 75 61 72 61  ubquery is guara
2d420 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68 65 20  nteed to be the 
2d430 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74  outer loop (so t
2d440 68 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 20 20  hat it.    **   
2d450 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 6e 65       does not ne
2d460 65 64 20 74 6f 20 62 65 20 63 6f 6d 70 75 74 65  ed to be compute
2d470 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  d more than once
2d480 29 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20  ).    **   (2)  
2d490 54 68 65 20 41 4c 4c 20 6b 65 79 77 6f 72 64 20  The ALL keyword 
2d4a0 61 66 74 65 72 20 53 45 4c 45 43 54 20 69 73 20  after SELECT is 
2d4b0 6f 6d 69 74 74 65 64 2e 20 20 28 41 70 70 6c 69  omitted.  (Appli
2d4c0 63 61 74 69 6f 6e 73 20 61 72 65 0a 20 20 20 20  cations are.    
2d4d0 2a 2a 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65  **        allowe
2d4e0 64 20 74 6f 20 73 61 79 20 22 53 45 4c 45 43 54  d to say "SELECT
2d4f0 20 41 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66   ALL" instead of
2d500 20 6a 75 73 74 20 22 53 45 4c 45 43 54 22 20 74   just "SELECT" t
2d510 6f 20 64 69 73 61 62 6c 65 0a 20 20 20 20 2a 2a  o disable.    **
2d520 20 20 20 20 20 20 20 20 74 68 65 20 75 73 65 20          the use 
2d530 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 29  of co-routines.)
2d540 0a 20 20 20 20 2a 2a 20 20 20 28 33 29 20 20 43  .    **   (3)  C
2d550 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 6e  o-routines are n
2d560 6f 74 20 64 69 73 61 62 6c 65 64 20 75 73 69 6e  ot disabled usin
2d570 67 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  g sqlite3_test_c
2d580 6f 6e 74 72 6f 6c 28 29 0a 20 20 20 20 2a 2a 20  ontrol().    ** 
2d590 20 20 20 20 20 20 20 77 69 74 68 20 53 51 4c 49         with SQLI
2d5a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2d5b0 4d 49 5a 41 54 49 4f 4e 53 2e 0a 20 20 20 20 2a  MIZATIONS..    *
2d5c0 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41  *.    ** TODO: A
2d5d0 72 65 20 74 68 65 72 65 20 6f 74 68 65 72 20 72  re there other r
2d5e0 65 61 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31  easons beside (1
2d5f0 29 20 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f  ) to use a co-ro
2d600 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70  utine.    ** imp
2d610 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20  lementation?.   
2d620 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30   */.    if( i==0
2d630 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69  .     && (pTabLi
2d640 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
2d650 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62          || (pTab
2d660 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f  List->a[1].fg.jo
2d670 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c  intype&(JT_LEFT|
2d680 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20  JT_CROSS))!=0)  
2d690 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 26  /* (1) */.     &
2d6a0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
2d6b0 20 53 46 5f 41 6c 6c 29 3d 3d 30 20 20 20 20 20   SF_All)==0     
2d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d6e0 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 26 26 20   (2) */.     && 
2d6f0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2d700 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53  led(db, SQLITE_S
2d710 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 20 20 20  ubqCoroutine)   
2d720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2d730 33 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  3) */.    ){.   
2d740 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20     /* Implement 
2d750 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
2d760 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  t will return a 
2d770 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
2d780 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
2d790 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e  * set on each in
2d7a0 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  vocation..      
2d7b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2d7c0 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
2d7d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2d7e0 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  +1;.      pItem-
2d7f0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
2d800 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2d810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d820 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
2d830 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
2d840 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61  >regReturn, 0, a
2d850 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56  ddrTop);.      V
2d860 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2d870 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
2d880 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2d890 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2d8a0 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20  Sub = addrTop;. 
2d8b0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2d8c0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
2d8d0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
2d8e0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2d8f0 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  n);.      explai
2d900 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
2d910 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75  m->iSelectId, (u
2d920 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  8)pParse->iNextS
2d930 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
2d940 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
2d950 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
2d960 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  t);.      pItem-
2d970 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  >pTab->nRowLogEs
2d980 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63  t = pSub->nSelec
2d990 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65  tRow;.      pIte
2d9a0 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2d9b0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  ne = 1;.      pI
2d9c0 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d  tem->regResult =
2d9d0 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20   dest.iSdst;.   
2d9e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
2d9f0 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49  dCoroutine(v, pI
2da00 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2da10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2da20 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2da30 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  drTop-1);.      
2da40 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2da50 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
2da60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2da70 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
2da80 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2da90 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70   will fill an ep
2daa0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2dab0 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  th.      ** the 
2dac0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
2dad0 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d  subquery.  pItem
2dae0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69  ->addrFillSub wi
2daf0 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a  ll point.      *
2db00 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73  * to the address
2db10 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
2db20 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70  d subroutine.  p
2db30 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a  Item->regReturn.
2db40 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65        ** is a re
2db50 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64  gister allocated
2db60 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62   to hold the sub
2db70 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
2db80 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a  ddress.      */.
2db90 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64        int topAdd
2dba0 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  r;.      int onc
2dbb0 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  eAddr = 0;.     
2dbc0 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20   int retAddr;.  
2dbd0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2dbe0 73 74 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b  st_item *pPrior;
2dbf0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2dc00 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2dc10 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ub==0 );.      p
2dc20 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
2dc30 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2dc40 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20  ;.      topAddr 
2dc50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2dc60 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2dc70 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67  r, 0, pItem->reg
2dc80 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70  Return);.      p
2dc90 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2dca0 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20  b = topAddr+1;. 
2dcb0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2dcc0 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d  fg.isCorrelated=
2dcd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
2dce0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
2dcf0 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74   is not correlat
2dd00 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65  ed and if we are
2dd10 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20   not inside of. 
2dd20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
2dd30 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c  ger, then we onl
2dd40 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  y need to comput
2dd50 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2dd60 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
2dd70 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a      ** once. */.
2dd80 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72          onceAddr
2dd90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2dda0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
2ddb0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2ddc0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2ddd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
2dde0 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
2ddf0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2de00 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ame));.      }el
2de10 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
2de20 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
2de30 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
2de40 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
2de50 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
2de60 20 20 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72    }.      pPrior
2de70 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65   = isSelfJoinVie
2de80 77 28 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65  w(pTabList, pIte
2de90 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  m);.      if( pP
2dea0 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rior ){.        
2deb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2dec0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
2ded0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c   pItem->iCursor,
2dee0 20 70 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72   pPrior->iCursor
2def0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2df00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
2df10 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
2df20 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61  est, SRT_EphemTa
2df30 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  b, pItem->iCurso
2df40 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c  r);.        expl
2df50 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
2df60 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
2df70 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
2df80 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
2df90 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2dfa0 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
2dfb0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  &dest);.      }.
2dfc0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
2dfd0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2dfe0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2dff0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
2e000 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
2e010 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e  beJumpHere(v, on
2e020 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  ceAddr);.      r
2e030 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  etAddr = sqlite3
2e040 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2e050 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  _Return, pItem->
2e060 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2e070 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2e080 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
2e090 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2e0a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2e0b0 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74  dbeChangeP1(v, t
2e0c0 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29  opAddr, retAddr)
2e0d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
2e0e0 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2e0f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
2e100 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2e110 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2e120 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2e130 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
2e140 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
2e150 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20  ExprHeight(p);. 
2e160 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2e170 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73  Various elements
2e180 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63   of the SELECT c
2e190 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c  opied into local
2e1a0 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20   variables for. 
2e1b0 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20   ** convenience 
2e1c0 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
2e1d0 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72  >pEList;.  pWher
2e1e0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
2e1f0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
2e200 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
2e210 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
2e220 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  .  sDistinct.isT
2e230 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
2e240 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
2e250 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43  )!=0;..#if SELEC
2e260 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2e270 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2e280 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
2e290 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
2e2a0 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
2e2b0 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52  p,("After all FR
2e2c0 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73  OM-clause analys
2e2d0 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  is:\n"));.    sq
2e2e0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2e2f0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2e300 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
2e310 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44  f the query is D
2e320 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20  ISTINCT with an 
2e330 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20  ORDER BY but is 
2e340 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
2e350 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74  , and .  ** if t
2e360 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69  he select-list i
2e370 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
2e380 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c  e ORDER BY list,
2e390 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79   then this query
2e3a0 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  .  ** can be rew
2e3b0 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55  ritten as a GROU
2e3c0 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77  P BY. In other w
2e3d0 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a  ords, this:.  **
2e3e0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
2e3f0 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52   DISTINCT xyz FR
2e400 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  OM ... ORDER BY 
2e410 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  xyz.  **.  ** is
2e420 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a   transformed to:
2e430 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
2e440 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  ELECT xyz FROM .
2e450 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20  .. GROUP BY xyz 
2e460 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
2e470 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  *.  ** The secon
2e480 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72  d form is prefer
2e490 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  red as a single 
2e4a0 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74  index (or temp-t
2e4b0 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20  able) may be .  
2e4c0 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  ** used for both
2e4d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e   the ORDER BY an
2e4e0 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  d DISTINCT proce
2e4f0 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e  ssing. As origin
2e500 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74  ally .  ** writt
2e510 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73  en the query mus
2e520 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62  t use a temp-tab
2e530 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  le for at least 
2e540 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  one of the ORDER
2e550 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49   .  ** BY and DI
2e560 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69  STINCT, and an i
2e570 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65  ndex or separate
2e580 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
2e590 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a  the other..  */.
2e5a0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
2e5b0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
2e5c0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
2e5d0 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20  ==SF_Distinct . 
2e5e0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
2e5f0 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72  ListCompare(sSor
2e600 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69  t.pOrderBy, pELi
2e610 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a  st, -1)==0.  ){.
2e620 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2e630 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
2e640 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
2e650 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
2e660 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
2e670 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b  (db, pEList, 0);
2e680 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74  .    /* Notice t
2e690 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74  hat even thought
2e6a0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73   SF_Distinct has
2e6b0 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72   been cleared fr
2e6c0 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  om p->selFlags,.
2e6d0 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74      ** the sDist
2e6e0 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73  inct.isTnct is s
2e6f0 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65  till set.  Hence
2e700 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65  , isTnct represe
2e710 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nts the.    ** o
2e720 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20  riginal setting 
2e730 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e  of the SF_Distin
2e740 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65  ct flag, not the
2e750 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
2e760 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2e770 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2e780 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54   );..#if SELECTT
2e790 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2e7a0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2e7b0 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
2e7c0 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  ){.      SELECTT
2e7d0 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2e7e0 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20  e,p,("Transform 
2e7f0 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52  DISTINCT into GR
2e800 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20  OUP BY:\n"));.  
2e810 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2e820 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2e830 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
2e840 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2e850 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
2e860 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2e870 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65  create an epheme
2e880 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a  ral index to.  *
2e890 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67  * do the sorting
2e8a0 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74  .  But this sort
2e8b0 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e  ing ephemeral in
2e8c0 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
2e8d0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73  .  ** being unus
2e8e0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
2e8f0 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20  an be extracted 
2e900 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
2e910 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61  der..  ** If tha
2e920 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
2e930 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  hen the OP_OpenE
2e940 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
2e950 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  tion will be.  *
2e960 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  * changed to an 
2e970 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20  OP_Noop once we 
2e980 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
2e990 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2e9a0 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65  x is.  ** not ne
2e9b0 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74  eded.  The sSort
2e9c0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76  .addrSortIndex v
2e9d0 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
2e9e0 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20  to facilitate.  
2e9f0 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  ** that change..
2ea00 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
2ea10 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2ea20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2ea30 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  fo;.    pKeyInfo
2ea40 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2ea50 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73  prList(pParse, s
2ea60 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30  Sort.pOrderBy, 0
2ea70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
2ea80 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75  ;.    sSort.iECu
2ea90 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
2eaa0 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74  Tab++;.    sSort
2eab0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2eac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ead0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2eae0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2eaf0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45          sSort.iE
2eb00 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f  Cursor, sSort.pO
2eb10 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b  rderBy->nExpr+1+
2eb20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
2eb30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61  ,.          (cha
2eb40 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2eb50 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b  KEYINFO.      );
2eb60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53  .  }else{.    sS
2eb70 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2eb80 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
2eb90 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
2eba0 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
2ebb0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
2ebc0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
2ebd0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
2ebe0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2ebf0 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
2ec00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ec10 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
2ec20 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69  emeral, pDest->i
2ec30 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  SDParm, pEList->
2ec40 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
2ec50 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
2ec60 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
2ec70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2ec80 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20  Label(v);.  if( 
2ec90 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2eca0 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30  F_FixedLimit)==0
2ecb0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65   ){.    p->nSele
2ecc0 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a  ctRow = 320;  /*
2ecd0 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20   4 billion rows 
2ece0 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65  */.  }.  compute
2ecf0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
2ed00 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
2ed10 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
2ed20 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64  ==0 && sSort.add
2ed30 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
2ed40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ed50 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20  ChangeOpcode(v, 
2ed60 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2ed70 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  dex, OP_SorterOp
2ed80 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73  en);.    sSort.s
2ed90 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54  ortFlags |= SORT
2eda0 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a  FLAG_UseSorter;.
2edb0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
2edc0 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
2edd0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
2ede0 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
2edf0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
2ee00 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2ee10 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
2ee20 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
2ee30 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2ee40 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
2ee50 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
2ee60 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2ee70 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
2ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee90 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73              sDis
2eea0 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30  tinct.tabTnct, 0
2eeb0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eed0 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
2eee0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2eef0 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30  rse, p->pEList,0
2ef00 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,0),.           
2ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
2ef30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2ef40 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
2ef50 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
2ef60 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2ef70 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
2ef80 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a  INCT_UNORDERED;.
2ef90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69    }else{.    sDi
2efa0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
2efb0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2efc0 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  T_NOOP;.  }..  i
2efd0 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
2efe0 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
2eff0 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20  /* No aggregate 
2f000 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
2f010 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2f020 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72   */.    u16 wctr
2f030 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69  lFlags = (sDisti
2f040 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45  nct.isTnct ? WHE
2f050 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
2f060 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
2f070 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  t( WHERE_USE_LIM
2f080 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69  IT==SF_FixedLimi
2f090 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c  t );.    wctrlFl
2f0a0 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61  ags |= p->selFla
2f0b0 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
2f0c0 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69  it;..    /* Begi
2f0d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
2f0e0 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e  can. */.    pWIn
2f0f0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
2f100 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
2f110 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
2f120 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
2f130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f150 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c  p->pEList, wctrl
2f160 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63  Flags, p->nSelec
2f170 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  tRow);.    if( p
2f180 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2f190 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2f1a0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2f1b0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
2f1c0 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
2f1d0 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
2f1e0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2f1f0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2f200 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2f210 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2f220 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2f230 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
2f240 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2f250 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
2f260 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2f270 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
2f280 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2f290 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2f2a0 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2f2b0 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
2f2c0 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
2f2d0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2f2e0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53  WInfo);.      sS
2f2f0 6f 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65  ort.bOrderedInne
2f300 72 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57  rLoop = sqlite3W
2f310 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72  hereOrderedInner
2f320 4c 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Loop(pWInfo);.  
2f330 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f      if( sSort.nO
2f340 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64  BSat==sSort.pOrd
2f350 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
2f360 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
2f370 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2f380 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2f390 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
2f3a0 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
2f3b0 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
2f3c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
2f3d0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
2f3e0 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
2f3f0 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
2f400 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
2f410 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
2f420 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
2f430 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
2f440 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72    if( sSort.addr
2f450 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
2f460 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d  sSort.pOrderBy==
2f470 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2f480 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
2f490 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
2f4a0 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
2f4b0 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
2f4c0 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
2f4d0 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65   loop. */.    se
2f4e0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2f4f0 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
2f500 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44   -1, &sSort, &sD
2f510 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
2f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f530 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2f540 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57  ContinueLabel(pW
2f550 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
2f560 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2f570 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
2f580 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20  l(pWInfo));..   
2f590 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
2f5a0 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
2f5b0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2f5c0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2f5d0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
2f5e0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68   /* This case wh
2f5f0 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61  en there exist a
2f600 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2f610 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59  ns or a GROUP BY
2f620 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f   clause.    ** o
2f630 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61  r both */.    Na
2f640 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
2f650 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
2f660 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
2f670 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
2f680 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
2f690 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
2f6a0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
2f6b0 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
2f6c0 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
2f6d0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2f6e0 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
2f6f0 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
2f700 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
2f710 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
2f720 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
2f730 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
2f740 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
2f750 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
2f760 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
2f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f780 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
2f790 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
2f7a0 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
2f7b0 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2f7d0 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
2f7e0 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
2f7f0 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
2f800 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
2f810 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
2f820 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
2f830 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
2f840 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
2f850 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
2f860 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
2f870 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
2f880 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  d;        /* End
2f890 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66   of processing f
2f8a0 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  or this SELECT *
2f8b0 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54  /.    int sortPT
2f8c0 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65  ab = 0;   /* Pse
2f8d0 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f  udotable used to
2f8e0 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20   decode sorting 
2f8f0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69  results */.    i
2f900 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20  nt sortOut = 0; 
2f910 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67     /* Output reg
2f920 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73  ister from the s
2f930 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  orter */.    int
2f940 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b   orderByGrp = 0;
2f950 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2f960 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44  GROUP BY and ORD
2f970 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61  ER BY are the sa
2f980 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  me */..    /* Re
2f990 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c  move any and all
2f9a0 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e   aliases between
2f9b0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2f9c0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  and the.    ** G
2f9d0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
2f9e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2f9f0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
2fa00 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
2fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fa20 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2fa30 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
2fa40 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
2fa50 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  tem;  /* For loo
2fa60 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73  ping over expres
2fa70 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a  sion in a list *
2fa80 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  /..      for(k=p
2fa90 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
2faa0 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74   pItem=p->pEList
2fab0 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
2fac0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2fad0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
2fae0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
2faf0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f        for(k=pGro
2fb00 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74  upBy->nExpr, pIt
2fb10 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
2fb20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
2fb30 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
2fb40 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
2fb50 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
2fb60 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c   assert( 66==sql
2fb70 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20  ite3LogEst(100) 
2fb80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
2fb90 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20  nSelectRow>66 ) 
2fba0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2fbb0 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  66;.    }else{. 
2fbc0 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
2fbd0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29  sqlite3LogEst(1)
2fbe0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   );.      p->nSe
2fbf0 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20  lectRow = 0;.   
2fc00 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2fc10 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
2fc20 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
2fc30 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2fc40 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a  d they are.    *
2fc50 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
2fc60 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  n it may be poss
2fc70 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20  ible to disable 
2fc80 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2fc90 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  use .    ** on t
2fca0 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20  he grounds that 
2fcb0 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c  the GROUP BY wil
2fcc0 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73  l cause elements
2fcd0 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20   to come out .  
2fce0 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72    ** in the corr
2fcf0 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c  ect order. It al
2fd00 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65  so may not - the
2fd10 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20   GROUP BY might 
2fd20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74  use a.    ** dat
2fd30 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74  abase index that
2fd40 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20   causes rows to 
2fd50 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  be grouped toget
2fd60 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a  her as required.
2fd70 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61      ** but not a
2fd80 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20  ctually sorted. 
2fd90 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f  Either way, reco
2fda0 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
2fdb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45   the.    ** ORDE
2fdc0 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42  R BY and GROUP B
2fdd0 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68  Y clauses are th
2fde0 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e  e same by settin
2fdf0 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70  g the orderByGrp
2fe00 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
2fe10 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  .  */.    if( sq
2fe20 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2fe30 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73  pare(pGroupBy, s
2fe40 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d  Sort.pOrderBy, -
2fe50 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  1)==0 ){.      o
2fe60 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20  rderByGrp = 1;. 
2fe70 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72     }. .    /* Cr
2fe80 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20  eate a label to 
2fe90 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20  jump to when we 
2fea0 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68  want to abort th
2feb0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61  e query */.    a
2fec0 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
2fed0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2fee0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
2fef0 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
2ff00 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
2ff10 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
2ff20 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
2ff30 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
2ff40 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
2ff50 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
2ff60 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
2ff70 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
2ff80 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
2ff90 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
2ffa0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
2ffb0 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
2ffc0 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
2ffd0 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
2ffe0 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
2fff0 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
30000 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
30010 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mnReg = pParse->
30020 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67  nMem+1;.    sAgg
30030 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
30040 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
30050 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
30060 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
30070 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
30080 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
30090 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
300a0 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
300b0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
300c0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
300d0 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70  st(&sNC, sSort.p
300e0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
300f0 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
30100 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
30110 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
30120 74 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57  t( pWhere==p->pW
30130 68 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20  here );.        
30140 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50  havingToWhere(pP
30150 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
30160 70 48 61 76 69 6e 67 2c 20 26 70 2d 3e 70 57 68  pHaving, &p->pWh
30170 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 70 57  ere);.        pW
30180 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
30190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
301a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
301b0 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
301c0 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
301d0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
301e0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
301f0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
30200 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
30210 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
30220 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
30230 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
30240 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
30250 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
30260 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
30270 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
30280 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63   |= NC_InAggFunc
30290 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
302a0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
302b0 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
302c0 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
302d0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
302e0 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
302f0 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20  ~NC_InAggFunc;. 
30300 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
30310 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65  o.mxReg = pParse
30320 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
30330 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
30340 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
30350 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
30360 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
30370 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
30380 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
30390 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
303a0 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
303b0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
303c0 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
303d0 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
303e0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
303f0 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
30400 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
30410 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
30420 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
30430 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
30440 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20     int addr1;   
30450 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
30460 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
30470 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
30480 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
30490 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
304a0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
304b0 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
304c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
304d0 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
304e0 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
304f0 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
30500 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
30510 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
30520 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
30530 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
30540 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
30550 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
30560 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
30570 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
30580 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
30590 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
305a0 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
305b0 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
305c0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
305d0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
305e0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
305f0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
30600 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
30610 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
30620 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
30630 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
30640 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
30650 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
30660 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
30670 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
30680 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
30690 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
306a0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
306b0 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
306c0 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
306d0 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
306e0 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
306f0 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
30700 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
30710 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
30720 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65  ll, the OP_Sorte
30730 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  rOpen instructio
30740 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
30750 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
30760 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
30770 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
30780 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
30790 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
307a0 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
307b0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
307c0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
307d0 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49  roupBy, 0, sAggI
307e0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  nfo.nColumn);.  
307f0 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
30800 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
30810 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
30820 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20  terOpen, .      
30830 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
30840 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66  tingIdx, sAggInf
30850 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
30860 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  , .          0, 
30870 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
30880 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
30890 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
308a0 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ze memory locati
308b0 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55  ons used by GROU
308c0 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70  P BY aggregate p
308d0 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
308e0 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61  */.      iUseFla
308f0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
30900 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74  em;.      iAbort
30910 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
30920 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
30930 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50  OutputRow = ++pP
30940 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
30950 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
30960 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
30970 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
30980 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50   regReset = ++pP
30990 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
309a0 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
309b0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
309c0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d  el(v);.      iAM
309d0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
309e0 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
309f0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
30a00 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
30a10 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72      iBMem = pPar
30a20 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
30a30 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
30a40 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
30a50 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
30a60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30a70 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
30a80 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
30a90 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
30aa0 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66  , "clear abort f
30ab0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
30ac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30ad0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
30ae0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
30af0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
30b00 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63  v, "indicate acc
30b10 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29  umulator empty")
30b20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30b30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
30b40 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c  _Null, 0, iAMem,
30b50 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d   iAMem+pGroupBy-
30b60 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20  >nExpr-1);..    
30b70 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f    /* Begin a loo
30b80 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  p that will extr
30b90 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72  act all source r
30ba0 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20  ows in GROUP BY 
30bb0 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  order..      ** 
30bc0 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c  This might invol
30bd0 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  ve two separate 
30be0 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50  loops with an OP
30bf0 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e  _Sort in between
30c00 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74  , or.      ** it
30c10 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67   might be a sing
30c20 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65  le loop that use
30c30 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78  s an index to ex
30c40 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  tract informatio
30c50 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  n.      ** in th
30c60 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f  e right order to
30c70 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20   begin with..   
30c80 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
30c90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
30ca0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
30cb0 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
30cc0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
30cd0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
30ce0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
30cf0 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f  st, pWhere, pGro
30d00 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20  upBy, 0,.       
30d10 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59     WHERE_GROUPBY
30d20 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f   | (orderByGrp ?
30d30 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
30d40 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20  UP : 0), 0.     
30d50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
30d60 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
30d70 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
30d80 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
30d90 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
30da0 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  o)==pGroupBy->nE
30db0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  xpr ){.        /
30dc0 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
30dd0 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
30de0 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
30df0 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
30e00 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
30e10 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
30e20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
30e30 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
30e40 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
30e50 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
30e60 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
30e70 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
30e80 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
30e90 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75   */.        grou
30ea0 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
30eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30ec0 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
30ed0 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
30ee0 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
30ef0 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
30f00 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
30f10 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
30f20 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
30f30 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
30f40 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
30f50 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
30f60 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
30f70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
30f80 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
30f90 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
30fa0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
30fb0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  /.        int re
30fc0 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69  gBase;.        i
30fd0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20  nt regRecord;.  
30fe0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a        int nCol;.
30ff0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f          int nGro
31000 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65  upBy;..        e
31010 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
31020 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
31030 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e       (sDistinct.
31040 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65  isTnct && (p->se
31050 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e  lFlags&SF_Distin
31060 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20  ct)==0) ?.      
31070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
31080 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55  ISTINCT" : "GROU
31090 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20  P BY");..       
310a0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
310b0 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70  ;.        nGroup
310c0 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By = pGroupBy->n
310d0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43  Expr;.        nC
310e0 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20  ol = nGroupBy;. 
310f0 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
31100 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
31110 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
31120 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
31130 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41            if( sA
31140 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69  ggInfo.aCol[i].i
31150 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
31160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
31170 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Col++;.         
31180 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
31190 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
311a0 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
311b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
311c0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
311d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
311e0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
311f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
31200 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
31210 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
31220 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
31230 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ase, 0, 0);.    
31240 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
31250 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
31260 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
31270 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
31280 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
31290 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
312a0 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
312b0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
312c0 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
312d0 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
312e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
312f0 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20  = j + regBase;. 
31300 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
31310 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
31320 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c  umnToReg(pParse,
31330 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
31340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31350 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
31360 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
31370 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20  ->iTable, r1);. 
31380 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
31390 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
313a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
313b0 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
313c0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
313d0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
313e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
313f0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
31400 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20   regBase, nCol, 
31410 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
31420 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31430 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
31440 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  erInsert, sAggIn
31450 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
31460 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
31470 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
31480 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
31490 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
314a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
314b0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
314c0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
314d0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
314e0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
314f0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41  nfo);.        sA
31500 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
31510 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62  xPTab = sortPTab
31520 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
31530 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f  +;.        sortO
31540 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ut = sqlite3GetT
31550 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
31560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
31570 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
31580 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74  OpenPseudo, sort
31590 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e  PTab, sortOut, n
315a0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
315b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
315c0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
315d0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
315e0 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b  ngIdx, addrEnd);
315f0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
31600 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20  ment((v, "GROUP 
31610 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65  BY sort")); Vdbe
31620 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
31630 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73       sAggInfo.us
31640 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b  eSortingIdx = 1;
31650 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31660 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
31670 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d  Parse);..      }
31680 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
31690 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f  e index or tempo
316a0 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64 20  rary table used 
316b0 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  by the GROUP BY 
316c0 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69  sort.      ** wi
316d0 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c  ll naturally del
316e0 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65  iver rows in the
316f0 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20   order required 
31700 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  by the ORDER BY.
31710 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c        ** clause,
31720 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65   cancel the ephe
31730 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e  meral table open
31740 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a   coded earlier..
31750 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
31760 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
31770 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20  imization - the 
31780 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73  correct answer s
31790 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67  hould result reg
317a0 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a  ardless..      *
317b0 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45  * Use the SQLITE
317c0 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c  _GroupByOrder fl
317d0 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54  ag with SQLITE_T
317e0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45  ESTCTRL_OPTIMIZE
317f0 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64  R to .      ** d
31800 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  isable this opti
31810 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73  mization for tes
31820 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
31830 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64  */.      if( ord
31840 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d  erByGrp && Optim
31850 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
31860 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  b, SQLITE_GroupB
31870 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20 20  yOrder) .       
31880 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20  && (groupBySort 
31890 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  || sqlite3WhereI
318a0 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29  sSorted(pWInfo))
318b0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
318c0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
318d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
318e0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
318f0 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61  oNoop(v, sSort.a
31900 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
31910 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
31920 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
31930 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
31940 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
31950 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
31960 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
31970 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
31980 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
31990 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
319a0 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
319b0 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
319c0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
319d0 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
319e0 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
319f0 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
31a00 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
31a10 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
31a20 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
31a30 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
31a40 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
31a50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
31a60 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
31a70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
31a80 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
31a90 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  ;.      if( grou
31aa0 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
31ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
31ac0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
31ad0 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e  rData, sAggInfo.
31ae0 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
31af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b00 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73        sortOut, s
31b10 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20  ortPTab);.      
31b20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
31b30 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
31b40 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
31b50 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
31b60 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
31b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
31b80 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
31b90 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65  ortPTab, j, iBMe
31ba0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  m+j);.        }e
31bb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
31bc0 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
31bd0 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
31be0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
31bf0 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
31c00 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  By->a[j].pExpr, 
31c10 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
31c20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31c40 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
31c50 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c  e, iAMem, iBMem,
31c60 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
31c70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31c80 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
31c90 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
31ca0 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
31cb0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
31cc0 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
31cd0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
31ce0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
31cf0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
31d00 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b   OP_Jump, addr1+
31d10 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20  1, 0, addr1+1); 
31d20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
31d30 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
31d40 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
31d50 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
31d60 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
31d70 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
31d80 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
31d90 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
31da0 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
31db0 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
31dc0 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
31dd0 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
31de0 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
31df0 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
31e00 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
31e10 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
31e20 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
31e30 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
31e40 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
31e50 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
31e60 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
31e70 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
31e80 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
31e90 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
31ea0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
31eb0 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
31ec0 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
31ed0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
31ee0 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
31ef0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
31f00 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
31f10 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
31f20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
31f30 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      s
31f40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
31f50 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
31f60 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
31f70 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
31f80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
31f90 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
31fa0 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
31fb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
31fc0 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
31fd0 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
31fe0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
31ff0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
32000 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
32010 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
32020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32030 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
32040 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
32050 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
32060 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
32070 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
32080 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
32090 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
320a0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
320b0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
320c0 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
320d0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
320e0 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
320f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
32100 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
32110 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
32120 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
32130 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
32140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32150 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
32160 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
32170 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
32180 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
32190 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
321a0 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
321b0 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
321c0 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
321d0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
321e0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
321f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
32200 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
32210 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
32220 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66  ngIdx, addrTopOf
32230 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56  Loop);.        V
32240 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
32250 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32260 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
32270 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
32280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32290 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
322a0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29   addrSortingIdx)
322b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
322c0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
322d0 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
322e0 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
322f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32300 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
32310 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
32320 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
32330 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
32340 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
32350 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
32360 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
32370 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
32380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
32390 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
323a0 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20   addrEnd);..    
323b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
323c0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
323d0 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
323e0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
323f0 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
32400 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
32410 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
32420 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
32430 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
32440 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
32450 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
32460 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
32470 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
32480 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
32490 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
324a0 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
324b0 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
324c0 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
324d0 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
324e0 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
324f0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
32500 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
32510 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
32520 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
32530 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
32540 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
32550 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
32560 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
32570 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
32580 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
32590 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
325a0 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
325b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
325c0 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66  (v, "set abort f
325d0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
325e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
325f0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
32600 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
32610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
32620 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
32630 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
32640 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
32650 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
32660 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
32670 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
32680 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
32690 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
326a0 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
326b0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
326c0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
326d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72  eComment((v, "Gr
326e0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
326f0 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69  erator entry poi
32700 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt"));.      sql
32710 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
32720 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
32730 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
32740 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
32750 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
32760 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
32770 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
32780 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
32790 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
327a0 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  ow+1, SQLITE_JUM
327b0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
327c0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
327d0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
327e0 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74  List, -1, &sSort
327f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32800 20 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e          &sDistin
32810 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
32820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32830 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
32840 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b  , addrSetAbort);
32850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
32860 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
32870 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
32880 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
32890 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
328a0 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20   groupby result 
328b0 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20  generator"));.. 
328c0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
328d0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
328e0 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68  at will reset th
328f0 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d  e group-by accum
32900 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a  ulator.      */.
32910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32920 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
32930 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
32940 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
32950 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
32960 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
32970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
32980 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
32990 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20  gReset);.     . 
329a0 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47     } /* endif pG
329b0 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61  roupBy.  Begin a
329c0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
329d0 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42   without GROUP B
329e0 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b  Y: */.    else {
329f0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
32a00 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64  *pDel = 0;.#ifnd
32a10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
32a20 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
32a30 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
32a40 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69     if( (pTab = i
32a50 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20  sSimpleCount(p, 
32a60 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29  &sAggInfo))!=0 )
32a70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
32a80 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20  isSimpleCount() 
32a90 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
32aa0 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72  r to a Table str
32ab0 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20  ucture, then.   
32ac0 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20       ** the SQL 
32ad0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20  statement is of 
32ae0 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20  the form:.      
32af0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
32b00 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
32b10 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20  ) FROM <tbl>.   
32b20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
32b30 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62  ** where the Tab
32b40 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  le structure ret
32b50 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73  urned represents
32b60 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20   table <tbl>..  
32b70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
32b80 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   ** This stateme
32b90 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20  nt is so common 
32ba0 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d  that it is optim
32bb0 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20  ized specially. 
32bc0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  The.        ** O
32bd0 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74  P_Count instruct
32be0 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20  ion is executed 
32bf0 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e  either on the in
32c00 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a  tkey table that.
32c10 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
32c20 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72  ins the data for
32c30 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20   table <tbl> or 
32c40 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e  on one of its in
32c50 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20  dexes. It.      
32c60 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74    ** is better t
32c70 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70  o execute the op
32c80 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73   on an index, as
32c90 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d   indexes are alm
32ca0 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ost.        ** a
32cb0 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72  lways spread acr
32cc0 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74  oss less pages t
32cd0 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73  han their corres
32ce0 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a  ponding tables..
32cf0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32d00 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62     const int iDb
32d10 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
32d20 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
32d30 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
32d40 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  a);.        cons
32d50 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61  t int iCsr = pPa
32d60 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
32d70 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63   /* Cursor to sc
32d80 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  an b-tree */.   
32d90 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
32da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
32dc0 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
32dd0 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  /.        KeyInf
32de0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
32df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32e00 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63  * Keyinfo for sc
32e10 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  anned index */. 
32e20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42         Index *pB
32e30 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
32e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
32e50 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20  est index found 
32e60 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
32e70 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54    int iRoot = pT
32e80 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20  ab->tnum;       
32e90 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
32ea0 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62  age of scanned b
32eb0 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20  -tree */..      
32ec0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
32ed0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
32ee0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
32ef0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
32f00 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
32f10 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
32f20 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
32f30 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
32f40 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  r the index that
32f50 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20   has the lowest 
32f60 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20  scan cost..     
32f70 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
32f80 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f   (2011-04-15) Do
32f90 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73   not do a full s
32fa0 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65  can of an unorde
32fb0 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  red index..     
32fc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
32fd0 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f   (2013-10-03) Do
32fe0 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65   not count the e
32ff0 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74  ntries in a part
33000 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ial index..     
33010 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
33020 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65   In practice the
33030 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
33040 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  re will not be u
33050 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  sed. It is only 
33060 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73  .        ** pass
33070 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70  ed to keep OP_Op
33080 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20  enRead happy..  
33090 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
330a0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
330b0 54 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73  Tab) ) pBest = s
330c0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
330d0 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
330e0 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
330f0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
33100 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
33110 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  xt){.          i
33120 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65  f( pIdx->bUnorde
33130 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
33140 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78    && pIdx->szIdx
33150 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52  Row<pTab->szTabR
33160 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ow.           &&
33170 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
33180 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  here==0.        
33190 20 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c     && (!pBest ||
331a0 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
331b0 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29  pBest->szIdxRow)
331c0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
331d0 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20            pBest 
331e0 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
331f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
33200 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20        if( pBest 
33210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  ){.          iRo
33220 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d  ot = pBest->tnum
33230 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
33240 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
33250 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
33260 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  rse, pBest);.   
33270 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
33280 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  /* Open a read-o
33290 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63  nly cursor, exec
332a0 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74  ute the OP_Count
332b0 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73  , close the curs
332c0 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  or. */.        s
332d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
332e0 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Int(v, OP_OpenRe
332f0 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c  ad, iCsr, iRoot,
33300 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20   iDb, 1);.      
33310 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
33320 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
33330 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
33340 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70  v, -1, (char *)p
33350 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
33360 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NFO);.        }.
33370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
33380 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
33390 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67  Count, iCsr, sAg
333a0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69  gInfo.aFunc[0].i
333b0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
333c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
333d0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73  v, OP_Close, iCs
333e0 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c  r);.        expl
333f0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70  ainSimpleCount(p
33400 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65  Parse, pTab, pBe
33410 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
33420 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
33430 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
33440 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  T */.      {.   
33450 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
33460 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
33470 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
33480 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20  owing forms:.   
33490 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
334a0 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  **   SELECT min(
334b0 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
334c0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
334d0 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  max(x) FROM ....
334e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
334f0 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20     ** If it is, 
33500 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64  then ask the cod
33510 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20  e in where.c to 
33520 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20  attempt to sort 
33530 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20  results.        
33540 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77  ** as if there w
33550 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20  as an "ORDER ON 
33560 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20  x" or "ORDER ON 
33570 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20  x DESC" clause. 
33580 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77  .        ** If w
33590 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74  here.c is able t
335a0 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74  o produce result
335b0 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73  s sorted in this
335c0 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20   order, then.   
335d0 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65       ** add vdbe
335e0 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f   code to break o
335f0 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  ut of the proces
33600 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20  sing loop after 
33610 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
33620 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
33630 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74  (since the first
33640 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
33650 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20  e loop is .     
33660 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
33670 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
33680 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  he row with the 
33690 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d  minimum or maxim
336a0 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  um .        ** v
336b0 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f  alue of x, the o
336c0 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64  nly row required
336d0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  )..        **.  
336e0 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69        ** A speci
336f0 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20  al flag must be 
33700 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
33710 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f  3WhereBegin() to
33720 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
33730 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61    ** modify beha
33740 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  vior as follows:
33750 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
33760 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68      **   + If th
33770 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45  e query is a "SE
33780 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68  LECT min(x)", th
33790 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65  en the loop code
337a0 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  d by.        ** 
337b0 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75      where.c shou
337c0 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f  ld not iterate o
337d0 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77  ver any values w
337e0 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
337f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
33800 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a  for x..        *
33810 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
33820 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63   The optimizer c
33830 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28  ode in where.c (
33840 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64  the thing that d
33850 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20  ecides which.   
33860 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65       **     inde
33870 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20  x or indices to 
33880 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63  use) should plac
33890 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  e a different pr
338a0 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20  iority on .     
338b0 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66     **     satisf
338c0 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20  ying the 'ORDER 
338d0 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20  BY' clause than 
338e0 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72  it does in other
338f0 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20   cases..        
33900 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20  **     Refer to 
33910 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  code and comment
33920 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72  s in where.c for
33930 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20   details..      
33940 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70    */.        Exp
33950 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d  rList *pMinMax =
33960 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66   0;.        u8 f
33970 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  lag = WHERE_ORDE
33980 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  RBY_NORMAL;.    
33990 20 20 20 20 0a 20 20 20 20 20 20 20 20 61 73 73      .        ass
339a0 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
339b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
339c0 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29  ssert( flag==0 )
339d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
339e0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20  >pHaving==0 ){. 
339f0 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20           flag = 
33a00 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67  minMaxQuery(&sAg
33a10 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29  gInfo, &pMinMax)
33a20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33a30 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
33a40 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21  ==0 || (pMinMax!
33a50 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 && pMinMax->n
33a60 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20  Expr==1) );..   
33a70 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b       if( flag ){
33a80 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d  .          pMinM
33a90 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ax = sqlite3Expr
33aa0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e  ListDup(db, pMin
33ab0 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Max, 0);.       
33ac0 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61     pDel = pMinMa
33ad0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  x;.          ass
33ae0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
33af0 61 69 6c 65 64 20 7c 7c 20 70 4d 69 6e 4d 61 78  ailed || pMinMax
33b00 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
33b10 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
33b20 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
33b30 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
33b40 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
33b50 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45  flag!=WHERE_ORDE
33b60 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20  RBY_MIN ?1:0;.  
33b70 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
33b80 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  x->a[0].pExpr->o
33b90 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
33ba0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33bb0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
33bc0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
33bd0 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
33be0 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
33bf0 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
33c00 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
33c10 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
33c20 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
33c30 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
33c40 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a  le row.        *
33c50 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
33c60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
33c70 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
33c80 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
33c90 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49  fo);.        pWI
33ca0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
33cb0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
33cc0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
33cd0 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 2c 66 6c 61  , pMinMax, 0,fla
33ce0 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  g,0);.        if
33cf0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  ( pWInfo==0 ){. 
33d00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33d10 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
33d20 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  b, pDel);.      
33d30 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
33d40 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
33d50 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63         updateAcc
33d60 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
33d70 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
33d80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 69       assert( pMi
33d90 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d  nMax==0 || pMinM
33da0 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  ax->nExpr==1 );.
33db0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
33dc0 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
33dd0 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20  d(pWInfo)>0 ){. 
33de0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33df0 56 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69  VdbeGoto(v, sqli
33e00 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62  te3WhereBreakLab
33e10 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20  el(pWInfo));.   
33e20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
33e30 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
33e40 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20  index",.        
33e50 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57          (flag==W
33e60 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
33e70 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
33e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33e90 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
33ea0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
33eb0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
33ec0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
33ed0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
33ee0 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72     }..      sSor
33ef0 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
33f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
33f10 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
33f20 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
33f30 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
33f40 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
33f50 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
33f60 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
33f70 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20  t, -1, 0, 0, .  
33f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f90 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
33fa0 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
33fb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
33fc0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
33fd0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
33fe0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
33ff0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
34000 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
34010 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
34020 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
34030 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
34040 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
34050 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
34060 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
34070 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
34080 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
34090 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
340a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
340b0 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
340c0 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
340d0 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
340e0 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
340f0 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
34100 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
34110 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
34120 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
34130 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20  pTable(pParse,. 
34140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34150 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
34160 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54  >0 ? "RIGHT PART
34170 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f   OF ORDER BY":"O
34180 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67  RDER BY");.    g
34190 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
341a0 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72  pParse, p, &sSor
341b0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
341c0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
341d0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
341e0 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
341f0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
34200 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
34210 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
34220 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  The SELECT has b
34230 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68  een coded. If th
34240 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ere is an error 
34250 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
34260 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74  ucture,.  ** set
34270 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
34280 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65   to 1. Otherwise
34290 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70   0. */.  rc = (p
342a0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a  Parse->nErr>0);.
342b0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
342c0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
342d0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
342e0 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
342f0 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
34300 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
34310 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
34320 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
34330 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
34340 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
34350 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
34360 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65  ctId);..  /* Ide
34370 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
34380 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66  es if results of
34390 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
343a0 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  to be output..  
343b0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
343c0 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d  ITE_OK && pDest-
343d0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
343e0 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
343f0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
34400 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
34410 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
34420 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
34430 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  , sAggInfo.aCol)
34440 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
34450 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
34460 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43  Func);.#if SELEC
34470 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
34480 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
34490 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72  Parse,p,("end pr
344a0 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20  ocessing\n"));. 
344b0 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
344c0 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66  Indent--;.#endif
344d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.