/ Hex Artifact Content
Login

Artifact 131eeddfcaf3777c4acd4727bf742b98af8183b5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  ee(db, p);.    p
0b50: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0b60: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0b70: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0b80: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0b90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ba0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
0bb0: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
0bc0: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
0bd0: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
0be0: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
0bf0: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
0c00: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
0c10: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
0c20: 3e 61 66 66 53 64 73 74 20 3d 20 30 3b 0a 20 20  >affSdst = 0;.  
0c30: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 30  pDest->iSdst = 0
0c40: 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  ;.  pDest->nSdst
0c50: 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
0c60: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53  Allocate a new S
0c70: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0c80: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
0c90: 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20  nter to that.** 
0ca0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65  structure..*/.Se
0cb0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
0cc0: 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65 20  ectNew(.  Parse 
0cd0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0ce0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0cf0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
0d00: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a   *pEList,     /*
0d10: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74   which columns t
0d20: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
0d30: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72 63   result */.  Src
0d40: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
0d50: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
0d60: 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74  lause -- which t
0d70: 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f  ables to scan */
0d80: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
0d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
0da0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
0db0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
0dc0: 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47  upBy,   /* the G
0dd0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
0de0: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
0df0: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  g,        /* the
0e00: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a   HAVING clause *
0e10: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
0e20: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65  rderBy,   /* the
0e30: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
0e40: 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c 61   */.  u32 selFla
0e50: 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs,         /* F
0e60: 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c 20  lag parameters, 
0e70: 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74 69  such as SF_Disti
0e80: 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  nct */.  Expr *p
0e90: 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f  Limit,         /
0ea0: 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20  * LIMIT value.  
0eb0: 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75  NULL means not u
0ec0: 73 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  sed */.  Expr *p
0ed0: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 2f  Offset         /
0ee0: 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20  * OFFSET value. 
0ef0: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f   NULL means no o
0f00: 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65  ffset */.){.  Se
0f10: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65  lect *pNew;.  Se
0f20: 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20  lect standin;.  
0f30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0f40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
0f50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
0f60: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
0f70: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
0f80: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
0f90: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
0fa0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
0fb0: 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64 69    pNew = &standi
0fc0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c  n;.  }.  if( pEL
0fd0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45  ist==0 ){.    pE
0fe0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
0ff0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1000: 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
1010: 78 70 72 28 64 62 2c 54 4b 5f 41 53 54 45 52 49  xpr(db,TK_ASTERI
1020: 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e  SK,0));.  }.  pN
1030: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
1040: 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  ist;.  pNew->op 
1050: 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
1060: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
1070: 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  selFlags;.  pNew
1080: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
1090: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
10a0: 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  0;.#if SELECTTRA
10b0: 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e 65  CE_ENABLED.  pNe
10c0: 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d  w->zSelName[0] =
10d0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65   0;.#endif.  pNe
10e0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
10f0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
1100: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
1110: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e   = -1;.  pNew->n
1120: 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20  SelectRow = 0;. 
1130: 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70   if( pSrc==0 ) p
1140: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Src = sqlite3DbM
1150: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1160: 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20  zeof(*pSrc));.  
1170: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
1180: 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  c;.  pNew->pWher
1190: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e  e = pWhere;.  pN
11a0: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
11b0: 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d  GroupBy;.  pNew-
11c0: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
11d0: 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ng;.  pNew->pOrd
11e0: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
11f0: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
1200: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = 0;.  pNew->pNe
1210: 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  xt = 0;.  pNew->
1220: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
1230: 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
1240: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 70 4e   = pOffset;.  pN
1250: 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20  ew->pWith = 0;. 
1260: 20 61 73 73 65 72 74 28 20 70 4f 66 66 73 65 74   assert( pOffset
1270: 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30  ==0 || pLimit!=0
1280: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1290: 3e 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  >0 || db->malloc
12a0: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
12b0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
12c0: 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61  led ) {.    clea
12d0: 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65 77  rSelect(db, pNew
12e0: 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  , pNew!=&standin
12f0: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  );.    pNew = 0;
1300: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1310: 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63  sert( pNew->pSrc
1320: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  !=0 || pParse->n
1330: 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61  Err>0 );.  }.  a
1340: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74  ssert( pNew!=&st
1350: 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72  andin );.  retur
1360: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53  n pNew;.}..#if S
1370: 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
1380: 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  ED./*.** Set the
1390: 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65 63   name of a Selec
13a0: 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64  t object.*/.void
13b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
13c0: 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c  tName(Select *p,
13d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
13e0: 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20  me){.  if( p && 
13f0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  zName ){.    sql
1400: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1410: 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65  zeof(p->zSelName
1420: 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20  ), p->zSelName, 
1430: 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  "%s", zName);.  
1440: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
1450: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69  ** Delete the gi
1460: 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63  ven Select struc
1470: 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ture and all of 
1480: 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
1490: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
14a0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73  e3SelectDelete(s
14b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
14c0: 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  ct *p){.  if( p 
14d0: 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62  ) clearSelect(db
14e0: 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , p, 1);.}../*.*
14f0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1500: 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  er to the right-
1510: 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
1520: 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f  ement in a compo
1530: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  und..*/.static S
1540: 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74  elect *findRight
1550: 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b  most(Select *p){
1560: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65  .  while( p->pNe
1570: 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78  xt ) p = p->pNex
1580: 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  t;.  return p;.}
1590: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20  ../*.** Given 1 
15a0: 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73  to 3 identifiers
15b0: 20 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a   preceding the J
15c0: 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74  OIN keyword, det
15d0: 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79  ermine the.** ty
15e0: 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74  pe of join.  Ret
15f0: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63  urn an integer c
1600: 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70  onstant that exp
1610: 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65  resses that type
1620: 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  .** in terms of 
1630: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69  the following bi
1640: 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20  t values:.**.** 
1650: 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20      JT_INNER.** 
1660: 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20      JT_CROSS.** 
1670: 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20      JT_OUTER.** 
1680: 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a      JT_NATURAL.*
1690: 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a  *     JT_LEFT.**
16a0: 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a       JT_RIGHT.**
16b0: 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72  .** A full outer
16c0: 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d   join is the com
16d0: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c  bination of JT_L
16e0: 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54  EFT and JT_RIGHT
16f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c  ..**.** If an il
1700: 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f  legal or unsuppo
1710: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69  rted join type i
1720: 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69  s seen, then sti
1730: 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a  ll return.** a j
1740: 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75  oin type, but pu
1750: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  t an error in th
1760: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
1770: 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
1780: 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65  e3JoinType(Parse
1790: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
17a0: 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20  *pA, Token *pB, 
17b0: 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e  Token *pC){.  in
17c0: 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  t jointype = 0;.
17d0: 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33    Token *apAll[3
17e0: 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20  ];.  Token *p;. 
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1810: 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34   0123456789 1234
1820: 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20  56789 123456789 
1830: 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  123 */.  static 
1840: 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54  const char zKeyT
1850: 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c  ext[] = "natural
1860: 65 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c  eftouterightfull
1870: 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73  innercross";.  s
1880: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
1890: 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20  ct {.    u8 i;  
18a0: 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
18b0: 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65  ng of keyword te
18c0: 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d  xt in zKeyText[]
18d0: 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72   */.    u8 nChar
18e0: 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f  ;    /* Length o
18f0: 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e  f the keyword in
1900: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
1910: 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20     u8 code;     
1920: 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73  /* Join type mas
1930: 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72  k */.  } aKeywor
1940: 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e  d[] = {.    /* n
1950: 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20  atural */ { 0,  
1960: 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20  7, JT_NATURAL   
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1980: 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a      /* left    *
1990: 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45  / { 6,  4, JT_LE
19a0: 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  FT|JT_OUTER     
19b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f       },.    /* o
19c0: 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20  uter   */ { 10, 
19d0: 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  5, JT_OUTER     
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
19f0: 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a      /* right   *
1a00: 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49  / { 14, 5, JT_RI
1a10: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20  GHT|JT_OUTER    
1a20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66       },.    /* f
1a30: 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20  ull    */ { 19, 
1a40: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
1a50: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
1a60: 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a      /* inner   *
1a70: 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e  / { 23, 5, JT_IN
1a80: 4e 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  NER             
1a90: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63       },.    /* c
1aa0: 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20  ross   */ { 28, 
1ab0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43  5, JT_INNER|JT_C
1ac0: 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a  ROSS         },.
1ad0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b    };.  int i, j;
1ae0: 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41  .  apAll[0] = pA
1af0: 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70  ;.  apAll[1] = p
1b00: 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20  B;.  apAll[2] = 
1b10: 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  pC;.  for(i=0; i
1b20: 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20  <3 && apAll[i]; 
1b30: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70  i++){.    p = ap
1b40: 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  All[i];.    for(
1b50: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
1b60: 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29  (aKeyword); j++)
1b70: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  {.      if( p->n
1b80: 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43  ==aKeyword[j].nC
1b90: 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26  har .          &
1ba0: 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
1bb0: 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26  p((char*)p->z, &
1bc0: 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72  zKeyText[aKeywor
1bd0: 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d  d[j].i], p->n)==
1be0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69  0 ){.        joi
1bf0: 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72  ntype |= aKeywor
1c00: 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20  d[j].code;.     
1c10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  }.    }.    test
1c30: 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d  case( j==0 || j=
1c40: 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d  =1 || j==2 || j=
1c50: 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d  =3 || j==4 || j=
1c60: 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20  =5 || j==6 );.  
1c70: 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69    if( j>=ArraySi
1c80: 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a  ze(aKeyword) ){.
1c90: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1ca0: 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20  = JT_ERROR;.    
1cb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1cc0: 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a   }.  if(.     (j
1cd0: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e  ointype & (JT_IN
1ce0: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d  NER|JT_OUTER))==
1cf0: 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54  (JT_INNER|JT_OUT
1d00: 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69  ER) ||.     (joi
1d10: 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52  ntype & JT_ERROR
1d20: 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f  )!=0.  ){.    co
1d30: 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20  nst char *zSp = 
1d40: 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " ";.    assert(
1d50: 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   pB!=0 );.    if
1d60: 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b  ( pC==0 ){ zSp++
1d70: 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ; }.    sqlite3E
1d80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1d90: 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75  "unknown or unsu
1da0: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
1db0: 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20  e: ".       "%T 
1dc0: 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c  %T%s%T", pA, pB,
1dd0: 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a   zSp, pC);.    j
1de0: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1df0: 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ER;.  }else if( 
1e00: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  (jointype & JT_O
1e10: 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20  UTER)!=0 .      
1e20: 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20     && (jointype 
1e30: 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  & (JT_LEFT|JT_RI
1e40: 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29  GHT))!=JT_LEFT )
1e50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1e60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
1e70: 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20       "RIGHT and 
1e80: 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73  FULL OUTER JOINs
1e90: 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74   are not current
1ea0: 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ly supported");.
1eb0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1ec0: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72  T_INNER;.  }.  r
1ed0: 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a  eturn jointype;.
1ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ef0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
1f00: 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65  olumn in a table
1f10: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
1f20: 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73  the column.** is
1f30: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
1f40: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  n the table..*/.
1f50: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d  static int colum
1f60: 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  nIndex(Table *pT
1f70: 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ab, const char *
1f80: 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
1f90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1fa0: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
1fb0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1fc0: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
1fd0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [i].zName, zCol)
1fe0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
1ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
2000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
2010: 20 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62   the first N tab
2020: 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f  les in pSrc, fro
2030: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c  m left to right,
2040: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a   looking for a.*
2050: 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73  * table that has
2060: 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20   a column named 
2070: 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  zCol.  .**.** Wh
2080: 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70  en found, set *p
2090: 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20  iTab and *piCol 
20a0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64  to the table ind
20b0: 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e  ex and column in
20c0: 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61  dex.** of the ma
20d0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e  tching column an
20e0: 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a  d return TRUE..*
20f0: 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e  *.** If not foun
2100: 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  d, return FALSE.
2110: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2120: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
2130: 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ex(.  SrcList *p
2140: 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72  Src,       /* Ar
2150: 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ray of tables to
2160: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74   search */.  int
2170: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
2180: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2190: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61  ables in pSrc->a
21a0: 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  [] to search */.
21b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
21c0: 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ol,    /* Name o
21d0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20  f the column we 
21e0: 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  are looking for 
21f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c  */.  int *piTab,
2200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2210: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
2220: 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20  ->a[] here */.  
2230: 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20  int *piCol      
2240: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e       /* Write in
2250: 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a  dex of pSrc->a[*
2260: 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f  piTab].pTab->aCo
2270: 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  l[] here */.){. 
2280: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2290: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
22a0: 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
22b0: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
22c0: 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
22d0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
22e0: 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a  olumn matching z
22f0: 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  Col */..  assert
2300: 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70  ( (piTab==0)==(p
2310: 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20  iCol==0) );  /* 
2320: 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20  Both or neither 
2330: 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f  are NULL */.  fo
2340: 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29  r(i=0; i<N; i++)
2350: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c  {.    iCol = col
2360: 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61  umnIndex(pSrc->a
2370: 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b  [i].pTab, zCol);
2380: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  .    if( iCol>=0
2390: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69   ){.      if( pi
23a0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Tab ){.        *
23b0: 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20  piTab = i;.     
23c0: 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c     *piCol = iCol
23d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
23f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2400: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2410: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2420: 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c  o add terms impl
2430: 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74  ied by JOIN synt
2440: 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45  ax to the.** WHE
2450: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
2460: 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54  sion of a SELECT
2470: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20   statement. The 
2480: 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a  new term, which.
2490: 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68  ** is ANDed with
24a0: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48   the existing WH
24b0: 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f  ERE clause, is o
24c0: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
24d0: 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20  *    (tab1.col1 
24e0: 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a  = tab2.col2).**.
24f0: 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73  ** where tab1 is
2500: 20 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62   the iSrc'th tab
2510: 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53  le in SrcList pS
2520: 72 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74  rc and tab2 is t
2530: 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27  he .** (iSrc+1)'
2540: 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20  th. Column col1 
2550: 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65  is column iColLe
2560: 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20  ft of tab1, and 
2570: 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d  col2 is.** colum
2580: 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74  n iColRight of t
2590: 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ab2..*/.static v
25a0: 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d  oid addWhereTerm
25b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
25c0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
25d0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
25e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
25f0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
2600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2610: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
2620: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2630: 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20    int iLeft,    
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
2660: 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69  rst table to joi
2670: 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  n in pSrc */.  i
2680: 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20  nt iColLeft,    
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
26b0: 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65  n in first table
26c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74   */.  int iRight
26d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
26f0: 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69  f second table i
2700: 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  n pSrc */.  int 
2710: 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20  iColRight,      
2720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2730: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
2740: 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a  n second table *
2750: 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a  /.  int isOuterJ
2760: 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  oin,            
2770: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2780: 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20  his is an OUTER 
2790: 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  join */.  Expr *
27a0: 2a 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20  *ppWhere        
27b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
27c0: 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63  OUT: The WHERE c
27d0: 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20  lause to add to 
27e0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
27f0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
2800: 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20  ;.  Expr *pE1;. 
2810: 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78   Expr *pE2;.  Ex
2820: 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65  pr *pEq;..  asse
2830: 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74  rt( iLeft<iRight
2840: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2850: 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20  rc->nSrc>iRight 
2860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2870: 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62  c->a[iLeft].pTab
2880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2890: 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54  rc->a[iRight].pT
28a0: 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73  ab );..  pE1 = s
28b0: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
28c0: 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c  mnExpr(db, pSrc,
28d0: 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74   iLeft, iColLeft
28e0: 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74  );.  pE2 = sqlit
28f0: 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78  e3CreateColumnEx
2900: 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69  pr(db, pSrc, iRi
2910: 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b  ght, iColRight);
2920: 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65  ..  pEq = sqlite
2930: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2940: 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 2c 20  K_EQ, pE1, pE2, 
2950: 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26  0);.  if( pEq &&
2960: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a   isOuterJoin ){.
2970: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2980: 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d  rty(pEq, EP_From
2990: 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Join);.    asser
29a0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
29b0: 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65  rty(pEq, EP_Toke
29c0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
29d0: 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ) );.    ExprSet
29e0: 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c  VVAProperty(pEq,
29f0: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2a00: 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f     pEq->iRightJo
2a10: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70  inTable = (i16)p
2a20: 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a  E2->iTable;.  }.
2a30: 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c    *ppWhere = sql
2a40: 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
2a50: 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a  *ppWhere, pEq);.
2a60: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2a70: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
2a80: 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72  perty on all ter
2a90: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
2aa0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41  expression..** A
2ab0: 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e  nd set the Expr.
2ac0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2ad0: 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76  to iTable for ev
2ae0: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  ery term in the.
2af0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
2b00: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
2b10: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
2b20: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
2b30: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
2b40: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
2b50: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
2b60: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
2b70: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
2b80: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
2b90: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
2ba0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
2bb0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2bc0: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
2bd0: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
2be0: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
2bf0: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
2c00: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
2c10: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
2c20: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
2c30: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
2c40: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
2c50: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
2c60: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
2c70: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
2c80: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
2c90: 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52  *.** The Expr.iR
2ca0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65  ightJoinTable te
2cb0: 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c  lls the WHERE cl
2cc0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
2cd0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72  that the.** expr
2ce0: 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f  ession depends o
2cf0: 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f  n table iRightJo
2d00: 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20  inTable even if 
2d10: 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f  that table is no
2d20: 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20  t.** explicitly 
2d30: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
2d40: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
2d50: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  at information i
2d60: 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20  s needed.** for 
2d70: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a  cases like this:
2d80: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2d90: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
2da0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
2db0: 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a  t2.b AND t1.x=5.
2dc0: 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20  **.** The where 
2dd0: 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20  clause needs to 
2de0: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
2df0: 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35  ng of the t1.x=5
2e00: 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61  .** term until a
2e10: 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70  fter the t2 loop
2e20: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49   of the join.  I
2e30: 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a  n that way, a.**
2e40: 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c   NULL t2 row wil
2e50: 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68  l be inserted wh
2e60: 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20  enever t1.x!=5. 
2e70: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a   If we do not.**
2e80: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2e90: 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69  ing of t1.x=5, i
2ea0: 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73  t will be proces
2eb0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  sed immediately.
2ec0: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20  ** after the t1 
2ed0: 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69  loop and rows wi
2ee0: 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20  th t1.x!=5 will 
2ef0: 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a  never appear in.
2f00: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77  ** the output, w
2f10: 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63  hich is incorrec
2f20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2f30: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
2f40: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
2f50: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
2f60: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2f70: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
2f80: 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Join);.    asser
2f90: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2fa0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
2fb0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2fc0: 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56  );.    ExprSetVV
2fd0: 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  AProperty(p, EP_
2fe0: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2ff0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
3000: 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b  e = (i16)iTable;
3010: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
3020: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70  TK_FUNCTION && p
3030: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
3040: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
3050: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e  for(i=0; i<p->x.
3060: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3070: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 4a  +){.        setJ
3080: 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69  oinExpr(p->x.pLi
3090: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
30a0: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d  iTable);.      }
30b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a 6f  .    }.    setJo
30c0: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
30d0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
30e0: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
30f0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
3100: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
3110: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
3120: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
3130: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
3140: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
3150: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
3160: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
3170: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
3180: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
3190: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
31a0: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
31b0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
31c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
31d0: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
31e0: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
31f0: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
3200: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
3210: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
3220: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
3230: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
3240: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
3250: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
3260: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
3270: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
3280: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
3290: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
32a0: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
32b0: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
32c0: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
32d0: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
32e0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
32f0: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
3300: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
3310: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
3320: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
3330: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
3340: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
3350: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
3360: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
3370: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
3380: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
3390: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
33a0: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
33b0: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
33c0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
33d0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
33e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33f0: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
3400: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3410: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
3420: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
3430: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
3440: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
3450: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3460: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
3470: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
3480: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
3490: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
34a0: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
34b0: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
34c0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
34d0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
34e0: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
34f0: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
3500: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
3510: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
3520: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
3530: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
3540: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65  {.    Table *pLe
3550: 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70  ftTab = pLeft->p
3560: 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Tab;.    Table *
3570: 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67  pRightTab = pRig
3580: 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e  ht->pTab;.    in
3590: 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20  t isOuter;..    
35a0: 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54  if( NEVER(pLeftT
35b0: 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54  ab==0 || pRightT
35c0: 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  ab==0) ) continu
35d0: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
35e0: 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69   (pRight->fg.joi
35f0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
3600: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
3610: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
3620: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
3630: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
3640: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
3650: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
3660: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
3670: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
3680: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
3690: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e   if( pRight->fg.
36a0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
36b0: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
36c0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c  f( pRight->pOn |
36d0: 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  | pRight->pUsing
36e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3700: 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a  se, "a NATURAL j
3710: 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  oin may not have
3720: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
3730: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
3740: 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  ause", 0);.     
3750: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3760: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
3770: 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d  =0; j<pRightTab-
3780: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
3790: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
37a0: 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  ;   /* Name of c
37b0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67  olumn in the rig
37c0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ht table */.    
37d0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
37e0: 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c     /* Matching l
37f0: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eft table */.   
3800: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f       int iLeftCo
3810: 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20  l;  /* Matching 
3820: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65  column in the le
3830: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  ft table */..   
3840: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69       zName = pRi
3850: 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ghtTab->aCol[j].
3860: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3870: 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  f( tableAndColum
3880: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3890: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
38a0: 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20   &iLeftCol) ){. 
38b0: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
38c0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
38d0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
38e0: 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20  Col, i+1, j,.   
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
3910: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
3920: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3930: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
3940: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
3950: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
3960: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
3970: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3980: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
3990: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
39a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
39b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
39c0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
39d0: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
39e0: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
39f0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
3a00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
3a10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3a20: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
3a30: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
3a40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3a50: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
3a60: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
3a70: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
3a80: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3a90: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
3aa0: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
3ab0: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
3ac0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
3ad0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
3ae0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
3af0: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
3b00: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67   p->pWhere, pRig
3b10: 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ht->pOn);.      
3b20: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b  pRight->pOn = 0;
3b30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
3b40: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
3b50: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
3b60: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
3b70: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
3b80: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
3b90: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
3ba0: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
3bb0: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
3bc0: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
3bd0: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
3be0: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
3bf0: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
3c00: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
3c10: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
3c20: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
3c30: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
3c40: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
3c50: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
3c60: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
3c70: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
3c80: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
3c90: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
3ca0: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
3cb0: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
3cc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3cd0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
3ce0: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
3cf0: 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d  *pList = pRight-
3d00: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
3d10: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
3d20: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
3d30: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
3d40: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3d50: 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20  the term in the 
3d60: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a  USING clause */.
3d70: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3d80: 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  t;       /* Tabl
3d90: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69  e on the left wi
3da0: 74 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  th matching colu
3db0: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
3dc0: 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b     int iLeftCol;
3dd0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3de0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
3df0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c   column on the l
3e00: 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  eft */.        i
3e10: 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20  nt iRightCol;   
3e20: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
3e30: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
3e40: 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74  umn on the right
3e50: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61   */..        zNa
3e60: 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  me = pList->a[j]
3e70: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3e80: 69 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75  iRightCol = colu
3e90: 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61  mnIndex(pRightTa
3ea0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
3eb0: 20 20 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c     if( iRightCol
3ec0: 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21  <0.         || !
3ed0: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
3ee0: 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a  dex(pSrc, i+1, z
3ef0: 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69  Name, &iLeft, &i
3f00: 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20  LeftCol).       
3f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
3f20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3f30: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
3f40: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
3f50: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
3f60: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
3f70: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
3f80: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
3f90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3fa0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
3fb0: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
3fc0: 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c  rm(pParse, pSrc,
3fd0: 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c   iLeft, iLeftCol
3fe0: 2c 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c  , i+1, iRightCol
3ff0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4000: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
4010: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
4020: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
4030: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4040: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
4050: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  ce */.static Key
4060: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
4070: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
4080: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4090: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
40a0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
40b0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
40c0: 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e  * Form the KeyIn
40d0: 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74  fo object from t
40e0: 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a  his ExprList */.
40f0: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
4100: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
4110: 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e  with this column
4120: 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69   of pList */.  i
4130: 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20  nt nExtra       
4140: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
4150: 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d  many extra colum
4160: 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f  ns to the end */
4170: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .);../*.** Gener
4180: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
4190: 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f  ll push the reco
41a0: 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  rd in registers 
41b0: 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75  regData.** throu
41c0: 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74 61  gh regData+nData
41d0: 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74  -1 onto the sort
41e0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
41f0: 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  id pushOntoSorte
4200: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
4210: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se,         /* P
4220: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4230: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
4240: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  t,        /* Inf
4250: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
4260: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
4270: 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  se */.  Select *
4280: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f  pSelect,       /
4290: 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45  * The whole SELE
42a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
42b0: 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20 20    int regData,  
42c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
42d0: 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  t register holdi
42e0: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  ng data to be so
42f0: 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rted */.  int re
4300: 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20 20  gOrigData,      
4310: 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73 74   /* First regist
4320: 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  er holding data 
4330: 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20 2a  before packing *
4340: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  /.  int nData,  
4350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4360: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
4370: 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72 72   in the data arr
4380: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  ay */.  int nPre
4390: 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20 2f  fixReg         /
43a0: 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69  * No. of reg pri
43b0: 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61 76  or to regData av
43c0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
43d0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
43e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74           /* Stmt
4410: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4420: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65  ion */.  int bSe
4430: 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72  q = ((pSort->sor
4440: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
4450: 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29  G_UseSorter)==0)
4460: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
4470: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
4480: 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  >nExpr;         
4490: 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f       /* No. of O
44a0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
44b0: 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e  .  int nBase = n
44c0: 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44  Expr + bSeq + nD
44d0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
44e0: 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e      /* Fields in
44f0: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4500: 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  /.  int regBase;
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72       /* Regs for
4540: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4550: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
4560: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
4570: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
4580: 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65       /* Assemble
4590: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
45a0: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20  */.  int nOBSat 
45b0: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42        /* ORDER B
45e0: 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20  Y terms to skip 
45f0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
4620: 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20  e to add sorter 
4630: 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72  record to sorter
4640: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   */.  int iLimit
4650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4660: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49           /* LIMI
4670: 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  T counter */..  
4680: 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20  assert( bSeq==0 
4690: 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20  || bSeq==1 );.  
46a0: 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 31  assert( nData==1
46b0: 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65 67   || regData==reg
46c0: 4f 72 69 67 44 61 74 61 20 29 3b 0a 20 20 69 66  OrigData );.  if
46d0: 28 20 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a  ( nPrefixReg ){.
46e0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65      assert( nPre
46f0: 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53  fixReg==nExpr+bS
4700: 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73  eq );.    regBas
4710: 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45  e = regData - nE
4720: 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65  xpr - bSeq;.  }e
4730: 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65  lse{.    regBase
4740: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
4750: 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  + 1;.    pParse-
4760: 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a  >nMem += nBase;.
4770: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53    }.  assert( pS
4780: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d  elect->iOffset==
4790: 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c  0 || pSelect->iL
47a0: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69  imit!=0 );.  iLi
47b0: 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69  mit = pSelect->i
47c0: 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74  Offset ? pSelect
47d0: 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53  ->iOffset+1 : pS
47e0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
47f0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
4800: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
4810: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73  akeLabel(v);.  s
4820: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
4830: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
4840: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Sort->pOrderBy, 
4850: 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67  regBase, regOrig
4860: 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20  Data,.          
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c  SQLITE_ECEL_DUP|
4890: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
48a0: 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a  ;.  if( bSeq ){.
48b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
48c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
48d0: 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43  ence, pSort->iEC
48e0: 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e  ursor, regBase+n
48f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Expr);.  }.  if(
4900: 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20 29   nPrefixReg==0 )
4910: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4920: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
4930: 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42 61  , regData, regBa
4940: 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e  se+nExpr+bSeq, n
4950: 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Data);.  }.  sql
4960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4970: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4980: 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c   regBase+nOBSat,
4990: 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72   nBase-nOBSat, r
49a0: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  egRecord);.  if(
49b0: 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20   nOBSat>0 ){.   
49c0: 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b   int regPrevKey;
49d0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
49e0: 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f  nOBSat columns o
49f0: 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  f the previous r
4a00: 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ow */.    int ad
4a10: 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41  drFirst;    /* A
4a20: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
4a30: 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f  _IfNot opcode */
4a40: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70  .    int addrJmp
4a50: 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
4a60: 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70  s of the OP_Jump
4a70: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56   opcode */.    V
4a80: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
4a90: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20   /* Opcode that 
4aa0: 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72  opens the sorter
4ab0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79   */.    int nKey
4ac0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
4ad0: 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b  ber of sorting k
4ae0: 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c  ey columns, incl
4af0: 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63  uding OP_Sequenc
4b00: 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  e */.    KeyInfo
4b10: 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72   *pKI;     /* Or
4b20: 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f  iginal KeyInfo o
4b30: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61 62  n the sorter tab
4b40: 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72  le */..    regPr
4b50: 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e  evKey = pParse->
4b60: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
4b70: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72  se->nMem += pSor
4b80: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e  t->nOBSat;.    n
4b90: 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53  Key = nExpr - pS
4ba0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53  ort->nOBSat + bS
4bb0: 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71  eq;.    if( bSeq
4bc0: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69   ){.      addrFi
4bd0: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
4be0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4bf0: 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  Not, regBase+nEx
4c00: 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b  pr); .    }else{
4c10: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4c20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4c30: 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp1(v, OP_Seque
4c40: 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e  nceTest, pSort->
4c50: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d  iECursor);.    }
4c60: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
4c70: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
4c80: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4c90: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72  P_Compare, regPr
4ca0: 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20  evKey, regBase, 
4cb0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a  pSort->nOBSat);.
4cc0: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
4cd0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53  3VdbeGetOp(v, pS
4ce0: 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64  ort->addrSortInd
4cf0: 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ex);.    if( pPa
4d00: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
4d10: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
4d20: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b      pOp->p2 = nK
4d30: 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20  ey + nData;.    
4d40: 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  pKI = pOp->p4.pK
4d50: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73  eyInfo;.    mems
4d60: 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64  et(pKI->aSortOrd
4d70: 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65  er, 0, pKI->nFie
4d80: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
4d90: 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74 65 73 74  _Jump below test
4da0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  able */.    sqli
4db0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
4dc0: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b  v, -1, (char*)pK
4dd0: 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  I, P4_KEYINFO);.
4de0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
4df0: 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a  I->nXField>2 );.
4e00: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79      pOp->p4.pKey
4e10: 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
4e20: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
4e30: 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  e, pSort->pOrder
4e40: 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20  By, nOBSat,.    
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69         pKI->nXFi
4e80: 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  eld-1);.    addr
4e90: 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Jmp = sqlite3Vdb
4ea0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
4eb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4ec0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
4ed0: 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c  p, addrJmp+1, 0,
4ee0: 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62   addrJmp+1); Vdb
4ef0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4f00: 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b    pSort->labelBk
4f10: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Out = sqlite3Vdb
4f20: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
4f30: 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74     pSort->regRet
4f40: 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
4f50: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
4f60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4f70: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
4f80: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
4f90: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
4fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4fb0: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
4fc0: 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69  Sorter, pSort->i
4fd0: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  ECursor);.    if
4fe0: 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ( iLimit ){.    
4ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5000: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
5010: 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e   iLimit, pSort->
5020: 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20  labelDone);.    
5030: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5040: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5050: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
5060: 28 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a  (v, addrFirst);.
5070: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5080: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
5090: 72 65 67 42 61 73 65 2c 20 72 65 67 50 72 65 76  regBase, regPrev
50a0: 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  Key, pSort->nOBS
50b0: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
50c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
50d0: 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20  addrJmp);.  }.  
50e0: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
50f0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
5100: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
5110: 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49   op = OP_SorterI
5120: 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nsert;.  }else{.
5130: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49      op = OP_IdxI
5140: 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  nsert;.  }.  sql
5150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5160: 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43  , op, pSort->iEC
5170: 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64  ursor, regRecord
5180: 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20  );.  if( iLimit 
5190: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
51a0: 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 30 3b  .    int r1 = 0;
51b0: 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
51c0: 20 73 6f 72 74 65 72 20 75 6e 74 69 6c 20 69 74   sorter until it
51d0: 20 63 6f 6e 74 61 69 6e 73 20 4c 49 4d 49 54 2b   contains LIMIT+
51e0: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 2e 20  OFFSET entries. 
51f0: 20 28 54 68 65 20 69 4c 69 6d 69 74 0a 20 20 20   (The iLimit.   
5200: 20 2a 2a 20 72 65 67 69 73 74 65 72 20 69 73 20   ** register is 
5210: 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74 68  initialized with
5220: 20 76 61 6c 75 65 20 6f 66 20 4c 49 4d 49 54 2b   value of LIMIT+
5230: 4f 46 46 53 45 54 2e 29 20 20 41 66 74 65 72 20  OFFSET.)  After 
5240: 74 68 65 20 73 6f 72 74 65 72 0a 20 20 20 20 2a  the sorter.    *
5250: 2a 20 66 69 6c 6c 73 20 75 70 2c 20 64 65 6c 65  * fills up, dele
5260: 74 65 20 74 68 65 20 6c 65 61 73 74 20 65 6e 74  te the least ent
5270: 72 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  ry in the sorter
5280: 20 61 66 74 65 72 20 65 61 63 68 20 69 6e 73 65   after each inse
5290: 72 74 2e 0a 20 20 20 20 2a 2a 20 54 68 75 73 20  rt..    ** Thus 
52a0: 77 65 20 6e 65 76 65 72 20 68 6f 6c 64 20 6d 6f  we never hold mo
52b0: 72 65 20 74 68 61 6e 20 74 68 65 20 4c 49 4d 49  re than the LIMI
52c0: 54 2b 4f 46 46 53 45 54 20 72 6f 77 73 20 69 6e  T+OFFSET rows in
52d0: 20 6d 65 6d 6f 72 79 20 61 74 20 6f 6e 63 65 20   memory at once 
52e0: 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  */.    addr = sq
52f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5300: 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c  v, OP_IfNotZero,
5310: 20 69 4c 69 6d 69 74 2c 20 30 2c 20 31 29 3b 20   iLimit, 0, 1); 
5320: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5330: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5340: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
5350: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
5360: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
5370: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5380: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5390: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
53a0: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
53b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
53c0: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
53d0: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
53e0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
53f0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
5400: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
5410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5420: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
5430: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
5440: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
5450: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
5460: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
5470: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5480: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5490: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
54a0: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
54b0: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
54c0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
54d0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
54e0: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
54f0: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
5500: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
5510: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
5520: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
5530: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
5540: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
5550: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
5560: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
5570: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5580: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5590: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
55a0: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
55b0: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
55c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
55d0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
55e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
55f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5600: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
5610: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
5620: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
5630: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
5640: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
5650: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  e(v, addr);.  }.
5660: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
5670: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
5680: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
5690: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
56a0: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
56b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
56c0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
56d0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
56e0: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
56f0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
5700: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
5710: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
5720: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
5730: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
5740: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
5750: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
5760: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
5770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5780: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
5790: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
57a0: 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65  ue, 1); VdbeCove
57b0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
57c0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
57d0: 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  FSET"));.  }.}..
57e0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
57f0: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
5800: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
5810: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
5820: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
5830: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
5840: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
5850: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
5860: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
5870: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
5880: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
5890: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
58a0: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
58b0: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
58c0: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
58d0: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
58e0: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
58f0: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
5900: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
5910: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
5920: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
5930: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
5940: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
5950: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
5960: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
5970: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
5980: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
5990: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
59a0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
59b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
59c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
59d0: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
59e0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
59f0: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
5a00: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
5a10: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
5a20: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
5a30: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
5a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5a50: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
5a60: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
5a70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5a80: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
5a90: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
5aa0: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
5ab0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
5ac0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5ad0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
5ae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
5af0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
5b00: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
5b10: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
5b20: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
5b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5b40: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5b50: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
5b60: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5b70: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5b80: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b  sert, iTab, r1);
5b90: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
5ba0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5bb0: 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   r1);.}..#ifndef
5bc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5bd0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
5be0: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
5bf0: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
5c00: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
5c10: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
5c20: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
5c30: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
5c40: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
5c50: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
5c60: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
5c70: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
5c80: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
5c90: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
5ca0: 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63  error used to oc
5cb0: 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70  cur.** in multip
5cc0: 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65  le places.  (The
5cd0: 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75   error only occu
5ce0: 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20  rs in one place 
5cf0: 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72  now, but we.** r
5d00: 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75  etain the subrou
5d10: 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  tine to minimize
5d20: 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e   code disruption
5d30: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
5d40: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
5d50: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
5d60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5d70: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  ,       /* Parse
5d80: 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53   context. */.  S
5d90: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
5da0: 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69  ,   /* Destinati
5db0: 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73  on of SELECT res
5dc0: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ults */.  int nE
5dd0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
5de0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
5df0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  lt columns retur
5e00: 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f  ned by SELECT */
5e10: 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  .){.  int eDest 
5e20: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
5e30: 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26    if( nExpr>1 &&
5e40: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
5e50: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
5e60: 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  et) ){.    sqlit
5e70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5e80: 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
5e90: 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
5ea0: 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
5eb0: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
5ec0: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
5ed0: 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ssion");.    ret
5ee0: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
5ef0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5f00: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
5f10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
5f20: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
5f30: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
5f40: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
5f50: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
5f60: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
5f70: 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ab is negative, 
5f80: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
5f90: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
5fa0: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
5fb0: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
5fc0: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
5fd0: 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20 69  ow.  If srcTab i
5fe0: 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  s.** zero or mor
5ff0: 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  e, then data is 
6000: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
6010: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
6020: 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74   used only .** t
6030: 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c  o get number col
6040: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74  umns and the dat
6050: 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 63  atype for each c
6060: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
6070: 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65   void selectInne
6080: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
6090: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
60a0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
60b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
60c0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
60d0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
60e0: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
60f0: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
6100: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
6110: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
6120: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
6130: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
6140: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6160: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
6170: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  his table */.  S
6180: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
6190: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
61a0: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
61b0: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52  ow to process OR
61c0: 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74  DER BY */.  Dist
61d0: 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e  inctCtx *pDistin
61e0: 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55  ct, /* If not NU
61f0: 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20  LL, info on how 
6200: 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49  to process DISTI
6210: 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  NCT */.  SelectD
6220: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
6230: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
6240: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
6250: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  s */.  int iCont
6260: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
6270: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
6280: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
6290: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
62a0: 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
62b0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
62c0: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
62d0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
62e0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
62f0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
6300: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
6310: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
6320: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
6330: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
6340: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
6350: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
6360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6370: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
6380: 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  y holding result
6390: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44   set */.  int eD
63a0: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
63b0: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
63c0: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
63d0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
63e0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
63f0: 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67  rm; /* First arg
6400: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
6410: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
6420: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
6430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6440: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
6450: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
6460: 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20  PrefixReg = 0;  
6470: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6480: 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
6490: 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65  ers before regRe
64a0: 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sult */..  asser
64b0: 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74  t( v );.  assert
64c0: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
64d0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70   hasDistinct = p
64e0: 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74  Distinct ? pDist
64f0: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
6500: 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  : WHERE_DISTINCT
6510: 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f  _NOOP;.  if( pSo
6520: 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72  rt && pSort->pOr
6530: 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74  derBy==0 ) pSort
6540: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72   = 0;.  if( pSor
6550: 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  t==0 && !hasDist
6560: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
6570: 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30  rt( iContinue!=0
6580: 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   );.    codeOffs
6590: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
65a0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
65b0: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
65c0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
65d0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75  ns..  */.  nResu
65e0: 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  ltCol = pEList->
65f0: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
6600: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
6610: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
6620: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
6630: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
6640: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
6650: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
6660: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6670: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6680: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6690: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
66a0: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
66b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
66c0: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
66d0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
66e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
66f0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
6700: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
6710: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
6720: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
6730: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
6740: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
6750: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
6760: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6770: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6780: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6790: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
67a0: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
67b0: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
67c0: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
67d0: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
67e0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
67f0: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
6800: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
6810: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
6820: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
6830: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
6840: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
6850: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
6860: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6870: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6880: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6890: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
68a0: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
68b0: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
68c0: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
68d0: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
68e0: 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20  ol;.  regResult 
68f0: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
6900: 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20    if( srcTab>=0 
6910: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
6920: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
6930: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
6940: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6950: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
6960: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
6970: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
6980: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
6990: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
69a0: 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  e));.    }.  }el
69b0: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
69c0: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
69d0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
69e0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
69f0: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
6a00: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
6a10: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
6a20: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
6a30: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
6a40: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
6a50: 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20   u8 ecelFlags;. 
6a60: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
6a70: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
6a80: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
6a90: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
6aa0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63 65 6c  ne ){.      ecel
6ab0: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 45  Flags = SQLITE_E
6ac0: 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c  CEL_DUP;.    }el
6ad0: 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c  se{.      ecelFl
6ae0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ags = 0;.    }. 
6af0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
6b00: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
6b10: 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65  e, pEList, regRe
6b20: 73 75 6c 74 2c 20 30 2c 20 65 63 65 6c 46 6c 61  sult, 0, ecelFla
6b30: 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  gs);.  }..  /* I
6b40: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
6b50: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
6b60: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
6b70: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
6b80: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
6b90: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
6ba0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
6bb0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
6bc0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
6bd0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
6be0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
6bf0: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
6c00: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
6c10: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
6c20: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
6c30: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
6c40: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
6c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
6c60: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
6c70: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
6c80: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
6c90: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
6ca0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
6cb0: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
6cc0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
6cd0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
6ce0: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
6cf0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
6d00: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
6d10: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
6d20: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
6d30: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
6d40: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
6d50: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6d60: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
6d70: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
6d80: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
6d90: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
6da0: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
6db0: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
6dc0: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
6dd0: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
6de0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
6df0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
6e00: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
6e10: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
6e20: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
6e30: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
6e40: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
6e50: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
6e60: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
6e70: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
6e80: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
6e90: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
6ea0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
6eb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6ec0: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
6ed0: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
6ee0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
6ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
6f00: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
6f10: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
6f20: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
6f30: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
6f40: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
6f50: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
6f60: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
6f70: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
6f80: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6f90: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
6fa0: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
6fb0: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
6fc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6fd0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6fe0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
6ff0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
7000: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
7010: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
7020: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
7030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
7040: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7050: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
7060: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
7070: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
7080: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
7090: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
70a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
70b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
70c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
70d0: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
70e0: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
70f0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
7100: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7110: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
7120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7130: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
7140: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
7150: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
7160: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
7170: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7180: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
7190: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
71a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
71b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
71c0: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
71d0: 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  p || pParse->db-
71e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
71f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7200: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7210: 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74  _Copy, regResult
7220: 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75  , regPrev, nResu
7230: 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ltCol-1);.      
7240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7250: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  ..      case WHE
7260: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
7270: 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
7280: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
7290: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
72a0: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
72b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
72c0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
72d0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
72e0: 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63  assert( pDistinc
72f0: 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  t->eTnctType==WH
7300: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
7310: 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20  RDERED );.      
7320: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
7330: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
7340: 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74  ->tabTnct, iCont
7350: 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  inue, nResultCol
7360: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7370: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
7380: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
7390: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
73a0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30      if( pSort==0
73b0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
73c0: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
73d0: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
73e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
73f0: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
7400: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
7410: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
7420: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
7430: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
7440: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
7450: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
7460: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
7470: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7480: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
7490: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
74a0: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
74b0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
74c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
74d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
74e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
74f0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
7500: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
7510: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
7520: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7530: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
7540: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
7550: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7560: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7570: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
7580: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
7590: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
75a0: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
75b0: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
75c0: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
75d0: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
75e0: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
75f0: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
7600: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
7610: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
7620: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
7630: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
7640: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
7650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7660: 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65  p3(v, OP_IdxDele
7670: 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65  te, iParm, regRe
7680: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7690: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
76a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
76b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
76c0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
76d0: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
76e0: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
76f0: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
7700: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
7710: 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20  ase SRT_Fifo:.  
7720: 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 46    case SRT_DistF
7730: 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ifo:.    case SR
7740: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
7750: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
7760: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
7770: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7780: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 72  ange(pParse, nPr
7790: 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20  efixReg+1);.    
77a0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
77b0: 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t==SRT_Table );.
77c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
77d0: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
77e0: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Tab );.      tes
77f0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7800: 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20  T_Fifo );.      
7810: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7820: 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b  =SRT_DistFifo );
7830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7840: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7850: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7860: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7870: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29  , r1+nPrefixReg)
7880: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
7890: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20  _OMIT_CTE.      
78a0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
78b0: 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20  istFifo ){.     
78c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
78d0: 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74  tination is Dist
78e0: 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f  Fifo, then curso
78f0: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
7900: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
7910: 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  n an ephemeral i
7920: 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75 72  ndex. If the cur
7930: 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65  rent row is alre
7940: 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20  ady present.    
7950: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
7960: 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  dex, do not writ
7970: 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70  e it to the outp
7980: 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20  ut. If not, add 
7990: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
79a0: 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68  urrent row to th
79b0: 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63  e index and proc
79c0: 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e 67  eed with writing
79d0: 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20   it to the.     
79e0: 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62     ** output tab
79f0: 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a  le as well.  */.
7a00: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
7a10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
7a20: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34  rrentAddr(v) + 4
7a30: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7a40: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
7a50: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
7a60: 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30  m+1, addr, r1, 0
7a70: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
7a80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7a90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7aa0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
7ab0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
7ac0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  r1);.        ass
7ad0: 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b  ert( pSort==0 );
7ae0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
7af0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
7b00: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
7b10: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7b20: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e  , pSort, p, r1+n
7b30: 50 72 65 66 69 78 52 65 67 2c 72 65 67 52 65 73  PrefixReg,regRes
7b40: 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52 65 67  ult,1,nPrefixReg
7b50: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7b60: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
7b70: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7b80: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
7b90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7ba0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
7bb0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
7bc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7bd0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7be0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
7bf0: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
7c00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7c10: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
7c20: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
7c30: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7c40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7c50: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
7c60: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7c70: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7c80: 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67  , r1, nPrefixReg
7c90: 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +1);.      break
7ca0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
7cb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
7cc0: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
7cd0: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
7ce0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
7cf0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
7d00: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
7d10: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
7d20: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
7d30: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
7d40: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
7d50: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
7d60: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
7d70: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
7d80: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
7d90: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
7da0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
7db0: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
7dc0: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
7dd0: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
7de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
7df0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
7e00: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
7e10: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
7e20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
7e30: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
7e40: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
7e50: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
7e60: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
7e70: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
7e80: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
7e90: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
7ea0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
7eb0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
7ec0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
7ed0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
7ee0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
7ef0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
7f00: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
7f10: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
7f20: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
7f30: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
7f40: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7f50: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7f60: 65 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74  esult, regResult
7f70: 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29  , 1, nPrefixReg)
7f80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7f90: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
7fa0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
7fb0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
7fc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7fd0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
7fe0: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
7ff0: 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61  ,1,r1, &pDest->a
8000: 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  ffSdst, 1);.    
8010: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
8020: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
8030: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
8040: 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  sult, 1);.      
8050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8060: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
8070: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
8080: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8090: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
80a0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
80b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
80c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
80d0: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
80e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
80f0: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
8100: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
8110: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8120: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
8130: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8140: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8150: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
8160: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
8170: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
8180: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
8190: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
81a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
81b0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
81c0: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
81d0: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
81e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
81f0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
8200: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
8210: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
8220: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
8230: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
8240: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
8250: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
8260: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
8270: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
8280: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
8290: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
82a0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
82b0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
82c0: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
82d0: 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ult, regResult, 
82e0: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  1, nPrefixReg);.
82f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8300: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
8310: 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b  Result==iParm );
8320: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
8330: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
8340: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
8350: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
8360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
8370: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
8380: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
8390: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
83a0: 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20  RY */..    case 
83b0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20  SRT_Coroutine:  
83c0: 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74       /* Send dat
83d0: 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e  a to a co-routin
83e0: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52  e */.    case SR
83f0: 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20  T_Output: {     
8400: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
8410: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
8420: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
8430: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
8440: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8450: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
8460: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69  utput );.      i
8470: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8480: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
8490: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
84a0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
84b0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
84c0: 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  ltCol,.         
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
84e0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
84f0: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
8500: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
8510: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8520: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
8530: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
8540: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
8550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8570: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
8580: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  w, regResult, nR
8590: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
85a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
85b0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
85c0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
85d0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
85e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
85f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
8600: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8610: 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69  T_CTE.    /* Wri
8620: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  te the results i
8630: 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71  nto a priority q
8640: 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64  ueue that is ord
8650: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a  er according to.
8660: 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f      ** pDest->pO
8670: 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e  rderBy (in pSO).
8680: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
8690: 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74   (in iParm) is t
86a0: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e  he cursor for an
86b0: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  .    ** index wi
86c0: 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20  th pSO->nExpr+2 
86d0: 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20  columns.  Build 
86e0: 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20  a key using pSO 
86f0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20  for the first.  
8700: 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20    ** pSO->nExpr 
8710: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61  columns, then ma
8720: 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73  ke sure all keys
8730: 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61   are unique by a
8740: 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66  dding a.    ** f
8750: 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65  inal OP_Sequence
8760: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61   column.  The la
8770: 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  st column is the
8780: 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f   record as a blo
8790: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
87a0: 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  se SRT_DistQueue
87b0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51  :.    case SRT_Q
87c0: 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ueue: {.      in
87d0: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  t nKey;.      in
87e0: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20  t r1, r2, r3;.  
87f0: 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74      int addrTest
8800: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
8810: 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20  List *pSO;.     
8820: 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f   pSO = pDest->pO
8830: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73  rderBy;.      as
8840: 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20  sert( pSO );.   
8850: 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e     nKey = pSO->n
8860: 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d  Expr;.      r1 =
8870: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
8880: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
8890: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
88a0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
88b0: 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  e, nKey+2);.    
88c0: 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31    r3 = r2+nKey+1
88d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
88e0: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
88f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
8900: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
8910: 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c 20  n is DistQueue, 
8920: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
8930: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
8940: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65        ** on a se
8950: 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69  cond ephemeral i
8960: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
8970: 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79  all values every
8980: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20   previously.    
8990: 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
89a0: 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20  the queue. */.  
89b0: 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20 3d        addrTest =
89c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
89d0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
89e0: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a  d, iParm+1, 0, .
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
8a20: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
8a30: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
8a40: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
8a50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8a60: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
8a70: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
8a80: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8a90: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28  , r3);.      if(
8aa0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
8ab0: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
8ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ad0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
8ae0: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29  rt, iParm+1, r3)
8af0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8b00: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8b10: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
8b20: 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a  ESULT);.      }.
8b30: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8b40: 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nKey; i++){.   
8b50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8b60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
8b70: 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8b90: 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61  gResult + pSO->a
8ba0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
8bb0: 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20  Col - 1,.       
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20     r2+i);.      
8be0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
8bf0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8c00: 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c  Sequence, iParm,
8c10: 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20   r2+nKey);.     
8c20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8c30: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
8c40: 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c  ord, r2, nKey+2,
8c50: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
8c60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8c70: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
8c80: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
8c90: 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20   if( addrTest ) 
8ca0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
8cb0: 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29  ere(v, addrTest)
8cc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
8cd0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
8ce0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
8cf0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
8d00: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
8d10: 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20   r2, nKey+2);.  
8d20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8d30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8d40: 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a  E_OMIT_CTE */...
8d50: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
8d60: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
8d70: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
8d80: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
8d90: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
8da0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8db0: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
8dc0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
8dd0: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
8de0: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
8df0: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
8e00: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
8e10: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
8e20: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
8e30: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
8e40: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
8e50: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
8e60: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
8e70: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
8e80: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
8e90: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
8ea0: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
8eb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8ec0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
8ed0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
8ee0: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
8ef0: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
8f00: 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c  eached.  Except,
8f10: 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69   if.  ** there i
8f20: 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77  s a sorter, in w
8f30: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f  hich case the so
8f40: 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  rter has already
8f50: 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68   limited.  ** th
8f60: 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e  e output for us.
8f70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72  .  */.  if( pSor
8f80: 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69  t==0 && p->iLimi
8f90: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
8fa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8fb0: 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
8fc0: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
8fd0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8fe0: 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  v);.  }.}../*.**
8ff0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49   Allocate a KeyI
9000: 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69  nfo object suffi
9010: 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64  cient for an ind
9020: 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75  ex of N key colu
9030: 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74  mns and.** X ext
9040: 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b  ra columns..*/.K
9050: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
9060: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69  eyInfoAlloc(sqli
9070: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20  te3 *db, int N, 
9080: 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45  int X){.  int nE
9090: 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69  xtra = (N+X)*(si
90a0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
90b0: 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20  );.  KeyInfo *p 
90c0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
90d0: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
90e0: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
90f0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
9100: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
9110: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
9120: 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28     p->nField = (
9130: 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58  u16)N;.    p->nX
9140: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a  Field = (u16)X;.
9150: 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43      p->enc = ENC
9160: 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  (db);.    p->db 
9170: 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = db;.    p->nRe
9180: 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65  f = 1;.    memse
9190: 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74  t(&p[1], 0, nExt
91a0: 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ra);.  }else{.  
91b0: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
91c0: 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t(db);.  }.  ret
91d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
91e0: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  Deallocate a Key
91f0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  Info object.*/.v
9200: 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oid sqlite3KeyIn
9210: 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20  foUnref(KeyInfo 
9220: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
9230: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
9240: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
9250: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
9260: 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c  p->nRef==0 ) sql
9270: 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 29  ite3DbFree(0, p)
9280: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
9290: 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  ake a new pointe
92a0: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f  r to a KeyInfo o
92b0: 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  bject.*/.KeyInfo
92c0: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
92d0: 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  Ref(KeyInfo *p){
92e0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
92f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e  assert( p->nRef>
9300: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  0 );.    p->nRef
9310: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
9320: 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   p;.}..#ifdef SQ
9330: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
9340: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
9350: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
9360: 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20   can be change. 
9370: 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   The KeyInfo obj
9380: 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20  ect.** can only 
9390: 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68  be changed if th
93a0: 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e  is is just a sin
93b0: 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  gle reference to
93c0: 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a   the object..**.
93d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
93e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73  is used only ins
93f0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
9400: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
9410: 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  nt sqlite3KeyInf
9420: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79  oIsWriteable(Key
9430: 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e  Info *p){ return
9440: 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23   p->nRef==1; }.#
9450: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9460: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
9470: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
9480: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
9490: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
94a0: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
94b0: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
94c0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
94d0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
94e0: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
94f0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
9500: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
9510: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
9520: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
9530: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
9540: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
9550: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
9560: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
9570: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
9580: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
9590: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
95a0: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
95b0: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
95c0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
95d0: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
95e0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
95f0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
9600: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
9610: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
9620: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
9630: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
9640: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
9650: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
9660: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
9670: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
9680: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
9690: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
96a0: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
96b0: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
96c0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
96d0: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
96e0: 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
96f0: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
9700: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  foFromExprList(.
9710: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9720: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9730: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
9740: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
9750: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20      /* Form the 
9760: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66  KeyInfo object f
9770: 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73  rom this ExprLis
9780: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  t */.  int iStar
9790: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
97a0: 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63  egin with this c
97b0: 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a  olumn of pList *
97c0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20  /.  int nExtra  
97d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
97e0: 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20  this many extra 
97f0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65  columns to the e
9800: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nd */.){.  int n
9810: 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Expr;.  KeyInfo 
9820: 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  *pInfo;.  struct
9830: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9840: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
9850: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
9860: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  b;.  int i;..  n
9870: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
9880: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
9890: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
98a0: 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74  oc(db, nExpr-iSt
98b0: 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a  art, nExtra+1);.
98c0: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
98d0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
98e0: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
98f0: 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20  able(pInfo) );. 
9900: 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c     for(i=iStart,
9910: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b   pItem=pList->a+
9920: 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b  iStart; i<nExpr;
9930: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
9940: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
9950: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Coll;.      pCol
9960: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
9970: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
9980: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
9990: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
99a0: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
99b0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49  ltColl;.      pI
99c0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
99d0: 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  art] = pColl;.  
99e0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
99f0: 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20  Order[i-iStart] 
9a00: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
9a10: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
9a20: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
9a30: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
9a40: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
9a50: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
9a60: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
9a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
9a80: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
9a90: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
9aa0: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
9ab0: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
9ac0: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
9ad0: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
9ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9af0: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
9b00: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
9b10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9b20: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
9b30: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
9b40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
9b50: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
9b60: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
9b70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
9b80: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23    return z;.}..#
9b90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9ba0: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
9bb0: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
9bc0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
9bd0: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
9be0: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
9bf0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
9c00: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
9c10: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
9c20: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
9c30: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
9c40: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
9c50: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
9c60: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
9c70: 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54     "USE TEMP B-T
9c80: 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a  REE FOR xxx".**.
9c90: 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20  ** where xxx is 
9ca0: 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54  one of "DISTINCT
9cb0: 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72  ", "ORDER BY" or
9cc0: 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61   "GROUP BY". Exa
9cd0: 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73  ctly which.** is
9ce0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
9cf0: 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65  he zUsage argume
9d00: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
9d10: 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  id explainTempTa
9d20: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
9d30: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
9d40: 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  Usage){.  if( pP
9d50: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
9d60: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
9d70: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9d80: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
9d90: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9da0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53  (pParse->db, "US
9db0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
9dc0: 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a  R %s", zUsage);.
9dd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9de0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
9df0: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
9e00: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
9e10: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
9e20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  .  }.}../*.** As
9e30: 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  sign expression 
9e40: 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41  b to lvalue a. A
9e50: 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20   second, no-op, 
9e60: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20  version of this 
9e70: 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76  macro.** is prov
9e80: 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  ided when SQLITE
9e90: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
9ea0: 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61   defined. This a
9eb0: 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a  llows the code.*
9ec0: 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  * in sqlite3Sele
9ed0: 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76  ct() to assign v
9ee0: 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75  alues to structu
9ef0: 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  re member variab
9f00: 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79  les that.** only
9f10: 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45   exist if SQLITE
9f20: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
9f30: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74   not defined wit
9f40: 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74  hout polluting t
9f50: 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20  he.** code with 
9f60: 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76  #ifndef directiv
9f70: 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20  es..*/.# define 
9f80: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
9f90: 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23  r(a, b) a = b..#
9fa0: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
9fb0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
9fc0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
9fd0: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
9fe0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
9ff0: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c  lainTempTable(y,
a000: 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  z).# define expl
a010: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c  ainSetInteger(y,
a020: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  z).#endif..#if !
a030: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a040: 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20  MIT_EXPLAIN) && 
a050: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a060: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
a070: 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  LECT)./*.** Unle
a080: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
a090: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
a0a0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
a0b0: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
a0c0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
a0d0: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
a0e0: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
a0f0: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
a100: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
a110: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
a120: 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20  ption is of one 
a130: 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73  of the two forms
a140: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  :.**.**   "COMPO
a150: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
a160: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
a170: 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50  (op)".**   "COMP
a180: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
a190: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
a1a0: 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52   USING TEMP B-TR
a1b0: 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77  EE (op)".**.** w
a1c0: 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69  here iSub1 and i
a1d0: 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74  Sub2 are the int
a1e0: 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20  egers passed as 
a1f0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
a200: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61  g.** function pa
a210: 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70  rameters, and op
a220: 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70   is the text rep
a230: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
a240: 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  he parameter.** 
a250: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
a260: 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
a270: 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65  "op" must be one
a280: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
a290: 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49  _EXCEPT,.** TK_I
a2a0: 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41  NTERSECT or TK_A
a2b0: 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f  LL. The first fo
a2c0: 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72  rm is used if ar
a2d0: 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69  gument bUseTmp i
a2e0: 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20  s .** false, or 
a2f0: 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  the second form 
a300: 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a  if it is true..*
a310: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
a320: 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a  plainComposite(.
a330: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
a360: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a380: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
a390: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
a3a0: 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20  XCEPT etc. */.  
a3b0: 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20  int iSub1,      
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31  /* Subquery id 1
a3e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c   */.  int iSub2,
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
a410: 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20  y id 2 */.  int 
a420: 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20  bUseTmp         
a430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a440: 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61  rue if a temp ta
a450: 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a  ble was used */.
a460: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ){.  assert( op=
a470: 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d  =TK_UNION || op=
a480: 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
a490: 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c  ==TK_INTERSECT |
a4a0: 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a  | op==TK_ALL );.
a4b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
a4c0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
a4d0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a4e0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61  ->pVdbe;.    cha
a4f0: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
a500: 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  3MPrintf(.      
a510: 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43    pParse->db, "C
a520: 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49  OMPOUND SUBQUERI
a530: 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28  ES %d AND %d %s(
a540: 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75  %s)", iSub1, iSu
a550: 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65  b2,.        bUse
a560: 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20  Tmp?"USING TEMP 
a570: 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c  B-TREE ":"", sel
a580: 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20  ectOpName(op).  
a590: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
a5a0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a5b0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
a5c0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
a5d0: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
a5e0: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  MIC);.  }.}.#els
a5f0: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
a600: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
a610: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
a620: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
a630: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
a640: 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78  nComposite(v,w,x
a650: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y,z).#endif../*
a660: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72  .** If the inner
a670: 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61   loop was genera
a680: 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d  ted using a non-
a690: 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72  null pOrderBy ar
a6a0: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  gument,.** then 
a6b0: 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65  the results were
a6c0: 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72   placed in a sor
a6d0: 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ter.  After the 
a6e0: 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74  loop is terminat
a6f0: 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  ed.** we need to
a700: 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20   run the sorter 
a710: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72  and output the r
a720: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c  esults.  The fol
a730: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
a740: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
a750: 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64  code needed to d
a760: 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  o that..*/.stati
a770: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53  c void generateS
a780: 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65  ortTail(.  Parse
a790: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
a7a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
a7b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
a7c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
a7d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
a7e0: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
a7f0: 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  rt,   /* Informa
a800: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45  tion on the ORDE
a810: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
a820: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
a830: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a840: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
a850: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
a860: 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20  *pDest /* Write 
a870: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
a880: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
a890: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a8a0: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20  ->pVdbe;        
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a8c0: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
a8d0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
a8e0: 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72  addrBreak = pSor
a8f0: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20  t->labelDone;   
a900: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
a910: 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f   here to exit lo
a920: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
a930: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
a940: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
a950: 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  v);  /* Jump her
a960: 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65  e for next cycle
a970: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a   */.  int addr;.
a980: 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d    int addrOnce =
a990: 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
a9a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
a9b0: 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  erBy = pSort->pO
a9c0: 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44  rderBy;.  int eD
a9d0: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
a9e0: 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20  st;.  int iParm 
a9f0: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
aa00: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a  ;.  int regRow;.
aa10: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a    int regRowid;.
aa20: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e    int nKey;.  in
aa30: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa50: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
aa60: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
aa70: 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20   int nSortData; 
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c   /* Trailing val
aaa0: 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ues to read from
aab0: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74   sorter */.  int
aac0: 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20   i;.  int bSeq; 
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
aaf0: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69   sorter record i
ab00: 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e  ncludes seq. no.
ab10: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
ab20: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
ab30: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75  _COMMENTS.  stru
ab40: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
ab50: 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45   *aOutEx = p->pE
ab60: 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a  List->a;.#endif.
ab70: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 42  .  assert( addrB
ab80: 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20  reak<0 );.  if( 
ab90: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
aba0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
abb0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
abc0: 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72  _Gosub, pSort->r
abd0: 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  egReturn, pSort-
abe0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
abf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
ac00: 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  o(v, addrBreak);
ac10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ac20: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
ac30: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
ac40: 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d  t);.  }.  iTab =
ac50: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
ac60: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
ac70: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
ac80: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
ac90: 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  e ){.    regRowi
aca0: 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f  d = 0;.    regRo
acb0: 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  w = pDest->iSdst
acc0: 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20  ;.    nSortData 
acd0: 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c  = nColumn;.  }el
ace0: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
acf0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
ad00: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
ad10: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
ad20: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
ad30: 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44  rse);.    nSortD
ad40: 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e  ata = 1;.  }.  n
ad50: 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Key = pOrderBy->
ad60: 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e  nExpr - pSort->n
ad70: 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f  OBSat;.  if( pSo
ad80: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
ad90: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
ada0: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  er ){.    int re
adb0: 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61  gSortOut = ++pPa
adc0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
add0: 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73 65  SortTab = pParse
ade0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66  ->nTab++;.    if
adf0: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
ae00: 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Out ){.      add
ae10: 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 43  rOnce = sqlite3C
ae20: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
ae30: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ae40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ae50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ae60: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
ae70: 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72  iSortTab, regSor
ae80: 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f  tOut, nKey+1+nSo
ae90: 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  rtData);.    if(
aea0: 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69   addrOnce ) sqli
aeb0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
aec0: 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20  v, addrOnce);.  
aed0: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
aee0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aef0: 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
af00: 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b   iTab, addrBreak
af10: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
af20: 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65  age(v);.    code
af30: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
af40: 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e  fset, addrContin
af50: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
af60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
af70: 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61  _SorterData, iTa
af80: 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 69  b, regSortOut, i
af90: 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62 53  SortTab);.    bS
afa0: 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  eq = 0;.  }else{
afb0: 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20  .    addr = 1 + 
afc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
afd0: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54  2(v, OP_Sort, iT
afe0: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20  ab, addrBreak); 
aff0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b000: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
b010: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61  v, p->iOffset, a
b020: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
b030: 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61    iSortTab = iTa
b040: 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b  b;.    bSeq = 1;
b050: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
b060: 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b  i<nSortData; i++
b070: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
b080: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
b090: 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c  olumn, iSortTab,
b0a0: 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72 65   nKey+bSeq+i, re
b0b0: 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64 62  gRow+i);.    Vdb
b0c0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
b0d0: 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61  ", aOutEx[i].zNa
b0e0: 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  me ? aOutEx[i].z
b0f0: 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d  Name : aOutEx[i]
b100: 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20  .zSpan));.  }.  
b110: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
b120: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
b130: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
b140: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b150: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
b160: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
b170: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
b180: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b190: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
b1a0: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
b1b0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
b1c0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
b1d0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
b1e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b1f0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
b200: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b210: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
b220: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
b230: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
b240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b250: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
b260: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
b270: 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a  w, 1, regRowid,.
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e          &pDest->
b2a0: 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  affSdst, 1);.   
b2b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
b2c0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
b2d0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
b2e0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
b2f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b300: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
b310: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
b320: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b330: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
b340: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
b350: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
b360: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
b370: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
b380: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50  arse, regRow, iP
b390: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
b3a0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
b3b0: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
b3c0: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
b3d0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
b3e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
b3f0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
b400: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
b410: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
b420: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
b430: 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20  utine ); .      
b440: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
b450: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
b460: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
b470: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b480: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ine );.      if(
b490: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
b4a0: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
b4b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b4c0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
b4d0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
b4e0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
b4f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
b500: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
b510: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
b520: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
b530: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b540: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b550: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
b560: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
b570: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
b580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b590: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
b5a0: 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  id ){.    sqlite
b5b0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
b5c0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b  pParse, regRow);
b5d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
b5e0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
b5f0: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
b600: 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  }.  /* The botto
b610: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
b620: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
b630: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b640: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
b650: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
b660: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
b670: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
b680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b690: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
b6a0: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
b6b0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
b6c0: 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
b6d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b6e0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
b6f0: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
b700: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
b710: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65  .  if( pSort->re
b720: 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65  gReturn ) sqlite
b730: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b740: 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  P_Return, pSort-
b750: 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73  >regReturn);.  s
b760: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
b770: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
b780: 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  eak);.}../*.** R
b790: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
b7a0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
b7b0: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
b7c0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
b7d0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
b7e0: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
b7f0: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
b800: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
b810: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
b820: 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65  ** Also try to e
b830: 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65  stimate the size
b840: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
b850: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
b860: 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  n that.** result
b870: 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a   in *pEstWidth..
b880: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
b890: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
b8a0: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
b8b0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
b8c0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
b8d0: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
b8e0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
b8f0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
b900: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
b910: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
b920: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
b930: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
b940: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
b950: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
b960: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
b970: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
b980: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
b990: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
b9a0: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
b9b0: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
b9c0: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
b9d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
b9e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
b9f0: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
ba00: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
ba10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
ba20: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
ba30: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
ba40: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
ba50: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
ba60: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
ba70: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
ba80: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
ba90: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
baa0: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
bab0: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
bac0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
bad0: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
bae0: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
baf0: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
bb00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bb10: 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f  e has either 3 o
bb20: 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64  r 6 parameters d
bb30: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
bb40: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
bb50: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
bb60: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
bb70: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
bb80: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  ion is used..*/.
bb90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
bba0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
bbb0: 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f  DATA.# define co
bbc0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
bbd0: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
bbe0: 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Impl(A,B,C,D,E,F
bbf0: 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64  ).#else /* if !d
bc00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
bc10: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
bc20: 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e  DATA) */.# defin
bc30: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
bc40: 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e  ,C,D,E,F) column
bc50: 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a  TypeImpl(A,B,F).
bc60: 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63 6f  #endif.static co
bc70: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
bc80: 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65  TypeImpl(.  Name
bc90: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
bca0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 23 69   Expr *pExpr,.#i
bcb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
bcc0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
bcd0: 54 41 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  TA.  const char 
bce0: 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f  **pzOrigDb,.  co
bcf0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
bd00: 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  gTab,.  const ch
bd10: 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a  ar **pzOrigCol,.
bd20: 23 65 6e 64 69 66 0a 20 20 75 38 20 2a 70 45 73  #endif.  u8 *pEs
bd30: 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61 72  tWidth.){.  char
bd40: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
bd50: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38  0;.  int j;.  u8
bd60: 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a 23   estWidth = 1;.#
bd70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
bd80: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
bd90: 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  ATA.  char const
bda0: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
bdb0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
bdc0: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  igTab = 0;.  cha
bdd0: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f  r const *zOrigCo
bde0: 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  l = 0;.#endif.. 
bdf0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
be00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
be10: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20  NC->pSrcList!=0 
be20: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  );.  switch( pEx
be30: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
be40: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
be50: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
be60: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
be70: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
be80: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
be90: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
bea0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
beb0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
bec0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
bed0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
bee0: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
bef0: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
bf00: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
bf10: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
bf20: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
bf30: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bf50: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
bf60: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
bf70: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
bf80: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bfa0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
bfb0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
bfc0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
bfd0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
bfe0: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
bff0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
c000: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  Tab */.      tes
c010: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
c020: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
c030: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
c040: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
c050: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
c060: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
c070: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
c080: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
c090: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
c0a0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
c0b0: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
c0c0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
c0d0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
c0e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
c0f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
c100: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
c110: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
c120: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
c130: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
c140: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
c150: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
c160: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c170: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
c180: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
c190: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
c1a0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
c1b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
c1c0: 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20   one time, code 
c1d0: 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20  such as "SELECT 
c1e0: 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20  new.x" within a 
c1f0: 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20  trigger would.  
c200: 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
c210: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  his condition to
c220: 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65   run.  Since the
c230: 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72  n, we have restr
c240: 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20  uctured how.    
c250: 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63      ** trigger c
c260: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
c270: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e   and so this con
c280: 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e  dition is no lon
c290: 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ger .        ** 
c2a0: 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65  possible. Howeve
c2b0: 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20  r, it can still 
c2c0: 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74  be true for stat
c2d0: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20  ements like.    
c2e0: 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
c2f0: 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a  wing:.        **
c300: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52  .        **   CR
c310: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f  EATE TABLE t1(co
c320: 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  l INTEGER);.    
c330: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
c340: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20  (SELECT t1.col) 
c350: 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20  FROM FROM t1;.  
c360: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c370: 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54   ** when columnT
c380: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
c390: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
c3a0: 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68  n "t1.col" in th
c3b0: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  e .        ** su
c3c0: 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69  b-select. In thi
c3d0: 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20  s case, set the 
c3e0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e  column type to N
c3f0: 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  ULL, even.      
c400: 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73    ** though it s
c410: 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20  hould really be 
c420: 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20  "INTEGER"..     
c430: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
c440: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70   This is not a p
c450: 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63  roblem, as the c
c460: 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74  olumn type of "t
c470: 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a  1.col" is never.
c480: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e          ** used.
c490: 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   When columnType
c4a0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
c4b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
c4c0: 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c          ** "(SEL
c4d0: 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68  ECT t1.col)", th
c4e0: 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69  e correct type i
c4f0: 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20  s returned (see 
c500: 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20  the TK_SELECT.  
c510: 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20        ** branch 
c520: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20  below.  */.     
c530: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c540: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
c550: 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e   pTab && pExpr->
c560: 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20  pTab==pTab );.  
c570: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
c580: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
c590: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
c5a0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
c5b0: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
c5c0: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
c5d0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
c5e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
c5f0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
c600: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
c610: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
c620: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
c630: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
c640: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
c650: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
c660: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
c670: 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c  0 && ALWAYS(iCol
c680: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
c690: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
c6a0: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
c6b0: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
c6c0: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
c6d0: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
c6e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
c6f0: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
c700: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
c710: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
c720: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
c730: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
c740: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
c750: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
c760: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
c770: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c780: 20 20 20 20 20 2a 2a 20 54 68 65 20 41 4c 57 41       ** The ALWA
c790: 59 53 28 29 20 69 73 20 62 65 63 61 75 73 65 20  YS() is because 
c7a0: 69 43 6f 6c 3e 3d 70 53 2d 3e 70 45 4c 69 73 74  iCol>=pS->pEList
c7b0: 2d 3e 6e 45 78 70 72 20 77 69 6c 6c 20 68 61 76  ->nExpr will hav
c7c0: 65 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  e been.         
c7d0: 20 2a 2a 20 63 61 75 67 68 74 20 61 6c 72 65 61   ** caught alrea
c7e0: 64 79 20 62 79 20 6e 61 6d 65 20 72 65 73 6f 6c  dy by name resol
c7f0: 75 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20  ution..         
c800: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61   */.          Na
c810: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
c820: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
c830: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
c840: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20  [iCol].pExpr;.  
c850: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63          sNC.pSrc
c860: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
c870: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
c880: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
c890: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
c8a0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
c8b0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
c8c0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
c8d0: 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a  C, p,&zOrigDb,&z
c8e0: 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f  OrigTab,&zOrigCo
c8f0: 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a  l, &estWidth); .
c900: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c910: 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
c920: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
c930: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
c940: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  le */.        as
c950: 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20  sert( !pS );.   
c960: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
c970: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
c980: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73  PKey;.        as
c990: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
c9a0: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
c9b0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
c9c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c9d0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c9e0: 54 41 44 41 54 41 0a 20 20 20 20 20 20 20 20 69  TADATA.        i
c9f0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
ca00: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
ca10: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
ca20: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22      zOrigCol = "
ca30: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
ca40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ca50: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62   zOrigCol = pTab
ca60: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
ca70: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  me;.          zT
ca80: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c  ype = sqlite3Col
ca90: 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61  umnType(&pTab->a
caa0: 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20  Col[iCol],0);.  
cab0: 20 20 20 20 20 20 20 20 65 73 74 57 69 64 74 68          estWidth
cac0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
cad0: 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20  ol].szEst;.     
cae0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72     }.        zOr
caf0: 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e  igTab = pTab->zN
cb00: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
cb10: 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a   pNC->pParse ){.
cb20: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
cb30: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cb40: 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50  aToIndex(pNC->pP
cb50: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
cb60: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
cb70: 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e      zOrigDb = pN
cb80: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
cb90: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
cba0: 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20         }.#else. 
cbb0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
cbc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
cbd0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
cbe0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
cbf0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
cc00: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
cc10: 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c  Type(&pTab->aCol
cc20: 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20  [iCol],0);.     
cc30: 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d 20       estWidth = 
cc40: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cc50: 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20  .szEst;.        
cc60: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  }.#endif.      }
cc70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cc80: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
cc90: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
cca0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
ccb0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
ccc0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
ccd0: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
cce0: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
ccf0: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a  ration type and.
cd00: 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20        ** origin 
cd10: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e  info for the sin
cd20: 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  gle column in th
cd30: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
cd40: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20  the SELECT.     
cd50: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20   ** statement.. 
cd60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61       */.      Na
cd70: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
cd80: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
cd90: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
cda0: 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ct;.      Expr *
cdb0: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
cdc0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
cdd0: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
cde0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
cdf0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
ce00: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
ce10: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
ce20: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
ce30: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
ce40: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
ce50: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
ce60: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
ce70: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
ce80: 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26  Db, &zOrigTab, &
ce90: 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69  zOrigCol, &estWi
cea0: 64 74 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65  dth); .      bre
ceb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
cec0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
ced0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
cee0: 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69  N_METADATA  .  i
cef0: 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20  f( pzOrigDb ){. 
cf00: 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69     assert( pzOri
cf10: 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f  gTab && pzOrigCo
cf20: 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  l );.    *pzOrig
cf30: 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20  Db = zOrigDb;.  
cf40: 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a    *pzOrigTab = z
cf50: 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a  OrigTab;.    *pz
cf60: 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43  OrigCol = zOrigC
cf70: 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ol;.  }.#endif. 
cf80: 20 69 66 28 20 70 45 73 74 57 69 64 74 68 20 29   if( pEstWidth )
cf90: 20 2a 70 45 73 74 57 69 64 74 68 20 3d 20 65 73   *pEstWidth = es
cfa0: 74 57 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e  tWidth;.  return
cfb0: 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
cfc0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
cfd0: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
cfe0: 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61  e VDBE the decla
cff0: 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20  ration types of 
d000: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
d010: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
d020: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
d030: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
d040: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d050: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
d060: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
d070: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
d080: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
d090: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
d0a0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
d0b0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
d0c0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
d0d0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64   set */.){.#ifnd
d0e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
d0f0: 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a  ECLTYPE.  Vdbe *
d100: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d110: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
d120: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
d130: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
d140: 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e  pTabList;.  sNC.
d150: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
d160: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
d170: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
d180: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
d190: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
d1a0: 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  xpr;.    const c
d1b0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64  har *zType;.#ifd
d1c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d1d0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
d1e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d1f0: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
d200: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
d210: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
d220: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
d230: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54  gCol = 0;.    zT
d240: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
d250: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
d260: 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26  Db, &zOrigTab, &
d270: 7a 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20  zOrigCol, 0);.. 
d280: 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d     /* The vdbe m
d290: 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e  ust make its own
d2a0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
d2b0: 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68  umn-type and oth
d2c0: 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  er .    ** colum
d2d0: 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e  n specific strin
d2e0: 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  gs, in case the 
d2f0: 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20  schema is reset 
d300: 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20  before this.    
d310: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
d320: 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20  ne is deleted.. 
d330: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
d340: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d350: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41  v, i, COLNAME_DA
d360: 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c  TABASE, zOrigDb,
d370: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d380: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
d390: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d3a0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c   i, COLNAME_TABL
d3b0: 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c  E, zOrigTab, SQL
d3c0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d3d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d3e0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d3f0: 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20  COLNAME_COLUMN, 
d400: 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45  zOrigCol, SQLITE
d410: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c  _TRANSIENT);.#el
d420: 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  se.    zType = c
d430: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
d440: 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  p, 0, 0, 0, 0);.
d450: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
d460: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d470: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
d480: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
d490: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d4a0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
d4b0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d4c0: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20  _OMIT_DECLTYPE) 
d4d0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  */.}../*.** Gene
d4e0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
d4f0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
d500: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
d510: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
d520: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
d530: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
d540: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
d550: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
d560: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
d570: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
d580: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
d590: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
d5a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d5b0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
d5c0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
d5d0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
d5e0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
d5f0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d600: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
d610: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
d620: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d630: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
d640: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
d650: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
d660: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d670: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
d680: 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e  ullNames, shortN
d690: 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ames;..#ifndef S
d6a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
d6b0: 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  IN.  /* If this 
d6c0: 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73  is an EXPLAIN, s
d6d0: 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f  kip this step */
d6e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
d6f0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65  xplain ){.    re
d700: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
d710: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
d720: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64  colNamesSet || d
d730: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d740: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
d750: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73  rt( v!=0 );.  as
d760: 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d  sert( pTabList!=
d770: 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  0 );.  pParse->c
d780: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
d790: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
d7a0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
d7b0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
d7c0: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
d7d0: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
d7e0: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
d7f0: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
d800: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
d810: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
d820: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
d830: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
d840: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
d850: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
d860: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
d870: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d      if( NEVER(p=
d880: 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
d890: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
d8a0: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
d8b0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
d8c0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
d8d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
d8e0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d8f0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d900: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
d910: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d920: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
d930: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
d940: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  | p->op==TK_AGG_
d950: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
d960: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
d970: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
d980: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
d990: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
d9a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59    for(j=0; ALWAY
d9b0: 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  S(j<pTabList->nS
d9c0: 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rc); j++){.     
d9d0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
d9e0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70  >a[j].iCursor==p
d9f0: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
da00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
da10: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
da20: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
da30: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
da40: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
da50: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
da60: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
da70: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
da80: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
da90: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
daa0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
dab0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
dac0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
dad0: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
dae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
daf0: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
db00: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
db10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
db20: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
db30: 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  !fullNames ){.  
db40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
db50: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
db60: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
db70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
db80: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
db90: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
dba0: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
dbb0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
dbc0: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
dbd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
dbe0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
dbf0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
dc00: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
dc10: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
dc20: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
dc30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc40: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
dc50: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
dc60: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
dc70: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
dc80: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
dc90: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
dca0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
dcb0: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
dcc0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
dcd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
dce0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
dcf0: 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e  ar *z = pEList->
dd00: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
dd10: 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c    z = z==0 ? sql
dd20: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
dd30: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
dd40: 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   : sqlite3DbStrD
dd50: 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  up(db, z);.     
dd60: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
dd70: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
dd80: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51  NAME_NAME, z, SQ
dd90: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
dda0: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
ddb0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
ddc0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
ddd0: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
dde0: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
ddf0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69  ession list (whi
de00: 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  ch is really the
de10: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
de20: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72  ions.** that for
de30: 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  m the result set
de40: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
de50: 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20  tement) compute 
de60: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63  appropriate.** c
de70: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
de80: 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75  a table that wou
de90: 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ld hold the expr
dea0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
deb0: 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61  ** All column na
dec0: 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71  mes will be uniq
ded0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ue..**.** Only t
dee0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
def0: 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43  are computed.  C
df00: 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c  olumn.zType, Col
df10: 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e  umn.zColl,.** an
df20: 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  d other fields o
df30: 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72  f Column are zer
df40: 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  oed..**.** Retur
df50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
df60: 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65  uccess.  If a me
df70: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
df80: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
df90: 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a   store NULL in *
dfa0: 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a  paCol and 0 in *
dfb0: 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e  pnCol and return
dfc0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
dfd0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c  /.int sqlite3Col
dfe0: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
dff0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e000: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e010: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e020: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
e030: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
e040: 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
e050: 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
e060: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
e070: 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
e080: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
e090: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
e0a0: 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
e0b0: 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
e0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
e0d0: 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
e0e0: 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
e0f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e100: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
e110: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
e120: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
e130: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
e140: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e150: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32  ounters */.  u32
e160: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
e170: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
e180: 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
e190: 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
e1a0: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
e1b0: 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
e1c0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
e1d0: 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
e1e0: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
e1f0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
e200: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e210: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
e220: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
e230: 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20   Expr *p;       
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e250: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61  Expression for a
e260: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63   single result c
e270: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
e280: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
e290: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
e2a0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
e2b0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
e2c0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
e2d0: 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b  f name in zName[
e2e0: 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20  ] */.  Hash ht; 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
e310: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
e320: 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61   */..  sqlite3Ha
e330: 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69  shInit(&ht);.  i
e340: 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20  f( pEList ){.   
e350: 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   nCol = pEList->
e360: 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20  nExpr;.    aCol 
e370: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
e380: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
e390: 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b  (aCol[0])*nCol);
e3a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61  .    testcase( a
e3b0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  Col==0 );.  }els
e3c0: 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b  e{.    nCol = 0;
e3d0: 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20  .    aCol = 0;. 
e3e0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f   }.  assert( nCo
e3f0: 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a  l==(i16)nCol );.
e400: 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b    *pnCol = nCol;
e410: 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c  .  *paCol = aCol
e420: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  ;..  for(i=0, pC
e430: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20  ol=aCol; i<nCol 
e440: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
e450: 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  iled; i++, pCol+
e460: 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
e470: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
e480: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
e490: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
e4a0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
e4b0: 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e  Collate(pEList->
e4c0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
e4d0: 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45   if( (zName = pE
e4e0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
e4f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
e500: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
e510: 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c  ontains an "AS <
e520: 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75  name>" phrase, u
e530: 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65  se <name> as the
e540: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c   name */.    }el
e550: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
e560: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
e570: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
e580: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
e590: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
e5a0: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
e5b0: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
e5c0: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
e5d0: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
e5e0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
e5f0: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
e600: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
e610: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
e620: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
e630: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
e640: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
e650: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e660: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
e670: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
e680: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
e690: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
e6a0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
e6b0: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
e6c0: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
e6d0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
e6e0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
e6f0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
e700: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
e710: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
e720: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
e730: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
e740: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43        zName = iC
e750: 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43  ol>=0 ? pTab->aC
e760: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a  ol[iCol].zName :
e770: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
e780: 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78  }else if( pColEx
e790: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pr->op==TK_ID ){
e7a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e7b0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
e7c0: 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49  y(pColExpr, EP_I
e7d0: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
e7e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c      zName = pCol
e7f0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
e800: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e810: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
e820: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
e830: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
e840: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
e850: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e  me */.        zN
e860: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
e870: 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  i].zSpan;.      
e880: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  }.    }.    zNam
e890: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
e8a0: 74 66 28 64 62 2c 20 22 25 73 22 2c 20 7a 4e 61  tf(db, "%s", zNa
e8b0: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  me);..    /* Mak
e8c0: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
e8d0: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
e8e0: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
e8f0: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
e900: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69    ** append an i
e910: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
e920: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
e930: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
e940: 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30    */.    cnt = 0
e950: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61  ;.    while( zNa
e960: 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61 73  me && sqlite3Has
e970: 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65  hFind(&ht, zName
e980: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e  )!=0 ){.      nN
e990: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
e9a0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
e9b0: 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20      if( nName>0 
e9c0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
e9d0: 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26  =nName-1; j>0 &&
e9e0: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
e9f0: 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b  zName[j]); j--){
ea00: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  }.        if( zN
ea10: 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e  ame[j]==':' ) nN
ea20: 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d  ame = j;.      }
ea30: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
ea40: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
ea50: 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61  , "%.*z:%u", nNa
ea60: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  me, zName, ++cnt
ea70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74  );.      if( cnt
ea80: 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72 61 6e  >3 ) sqlite3_ran
ea90: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 63  domness(sizeof(c
eaa0: 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20  nt), &cnt);.    
eab0: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
eac0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73  e = zName;.    s
ead0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70  qlite3ColumnProp
eae0: 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30  ertiesFromName(0
eaf0: 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , pCol);.    if(
eb00: 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65   zName && sqlite
eb10: 33 48 61 73 68 49 6e 73 65 72 74 28 26 68 74 2c  3HashInsert(&ht,
eb20: 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70   zName, pCol)==p
eb30: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
eb40: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
eb50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
eb60: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
eb70: 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ht);.  if( db->m
eb80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
eb90: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b     for(j=0; j<i;
eba0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   j++){.      sql
ebb0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
ebc0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[j].zName);. 
ebd0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ebe0: 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29  DbFree(db, aCol)
ebf0: 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30  ;.    *paCol = 0
ec00: 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30  ;.    *pnCol = 0
ec10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ec20: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
ec30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
ec40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ec50: 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f   Add type and co
ec60: 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
ec70: 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  ion to a column 
ec80: 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  list based on.**
ec90: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
eca0: 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ent..** .** The 
ecb0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73  column list pres
ecc0: 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d  umably came from
ecd0: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d   selectColumnNam
ece0: 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  esFromExprList()
ecf0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ..** The column 
ed00: 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61  list has only na
ed10: 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f  mes, not types o
ed20: 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54  r collations.  T
ed30: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
ed40: 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20  oes through and 
ed50: 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61  adds the types a
ed60: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a  nd collations..*
ed70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ed80: 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
ed90: 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20  all identifiers 
eda0: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  in the SELECT.**
edb0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65   statement be re
edc0: 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  solved..*/.void 
edd0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
ede0: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
edf0: 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  lation(.  Parse 
ee00: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
ee10: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ee20: 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  xts */.  Table *
ee30: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  pTab,          /
ee40: 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70  * Add column typ
ee50: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
ee60: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
ee70: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
ee80: 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
ee90: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
eea0: 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  ne types and col
eeb0: 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  lations */.){.  
eec0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
eed0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65  arse->db;.  Name
eee0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43  Context sNC;.  C
eef0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43  olumn *pCol;.  C
ef00: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
ef10: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
ef20: 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  p;.  struct Expr
ef30: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
ef40: 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a  u64 szAll = 0;..
ef50: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
ef60: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
ef70: 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  ( (pSelect->selF
ef80: 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
ef90: 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ed)!=0 );.  asse
efa0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  rt( pTab->nCol==
efb0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
efc0: 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  >nExpr || db->ma
efd0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
efe0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
eff0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
f000: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
f010: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
f020: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
f030: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
f040: 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45   a = pSelect->pE
f050: 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  List->a;.  for(i
f060: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
f070: 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  Col; i<pTab->nCo
f080: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
f090: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f0a0: 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20  *zType;.    int 
f0b0: 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61 5b  n, m;.    p = a[
f0c0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a 54  i].pExpr;.    zT
f0d0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
f0e0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
f0f0: 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29  0, &pCol->szEst)
f100: 3b 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70  ;.    szAll += p
f110: 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20  Col->szEst;.    
f120: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
f130: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
f140: 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28  nity(p);.    if(
f150: 20 7a 54 79 70 65 20 26 26 20 28 6d 20 3d 20 73   zType && (m = s
f160: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f170: 54 79 70 65 29 29 3e 30 20 29 7b 0a 20 20 20 20  Type))>0 ){.    
f180: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
f190: 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  len30(pCol->zNam
f1a0: 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  e);.      pCol->
f1b0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
f1c0: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
f1d0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  b, pCol->zName, 
f1e0: 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  n+m+2);.      if
f1f0: 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b  ( pCol->zName ){
f200: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
f210: 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31  &pCol->zName[n+1
f220: 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a  ], zType, m+1);.
f230: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
f240: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
f250: 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20  G_HASTYPE;.     
f260: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
f270: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
f280: 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  =0 ) pCol->affin
f290: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
f2a0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c  _BLOB;.    pColl
f2b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
f2c0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
f2d0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
f2e0: 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d  && pCol->zColl==
f2f0: 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
f300: 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
f310: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
f320: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
f330: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
f340: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
f350: 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b  LogEst(szAll*4);
f360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
f370: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
f380: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
f390: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
f3a0: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
f3b0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f3c0: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
f3d0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
f3e0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
f3f0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
f400: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
f410: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
f420: 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
f430: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
f440: 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b   int savedFlags;
f450: 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d  ..  savedFlags =
f460: 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62   db->flags;.  db
f470: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
f480: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b  TE_FullColNames;
f490: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
f4a0: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
f4b0: 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53  ames;.  sqlite3S
f4c0: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
f4d0: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  , pSelect, 0);. 
f4e0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
f4f0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
f500: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
f510: 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
f520: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
f530: 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  or;.  db->flags 
f540: 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20  = savedFlags;.  
f550: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
f560: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
f570: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
f580: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
f590: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f5a0: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69   }.  /* The sqli
f5b0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
f5c0: 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75  lect() is only u
f5d0: 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77  sed n contexts w
f5e0: 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20  here lookaside. 
f5f0: 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20   ** is disabled 
f600: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
f610: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
f620: 62 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e  ble );.  pTab->n
f630: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
f640: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54  >zName = 0;.  pT
f650: 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
f660: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
f670: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
f680: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 73  (1048576) );.  s
f690: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
f6a0: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
f6b0: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  , pSelect->pELis
f6c0: 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
f6d0: 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
f6e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
f6f0: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
f700: 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
f710: 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Tab, pSelect);. 
f720: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
f730: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
f740: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f750: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
f760: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
f770: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f780: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
f790: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
f7a0: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
f7b0: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
f7c0: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
f7d0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
f7e0: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
f7f0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
f800: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
f810: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
f820: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  se..*/.static SQ
f830: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 56 64  LITE_NOINLINE Vd
f840: 62 65 20 2a 61 6c 6c 6f 63 56 64 62 65 28 50 61  be *allocVdbe(Pa
f850: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
f860: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
f870: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
f880: 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
f890: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 20 73  se);.  if( v ) s
f8a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
f8b0: 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20  (v, OP_Init);.  
f8c0: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
f8d0: 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f  level==0.   && O
f8e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
f8f0: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
f900: 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
f910: 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50  nst).  ){.    pP
f920: 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
f930: 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  tor = 1;.  }.  r
f940: 65 74 75 72 6e 20 76 3b 0a 7d 0a 56 64 62 65 20  eturn v;.}.Vdbe 
f950: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
f960: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
f970: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
f980: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 65 74  se->pVdbe;.  ret
f990: 75 72 6e 20 76 20 3f 20 76 20 3a 20 61 6c 6c 6f  urn v ? v : allo
f9a0: 63 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 7d  cVdbe(pParse);.}
f9b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
f9c0: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
f9d0: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
f9e0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
f9f0: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
fa00: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
fa10: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
fa20: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
fa30: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
fa40: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
fa50: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
fa60: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
fa70: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
fa80: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
fa90: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
faa0: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
fab0: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
fac0: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
fad0: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
fae0: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
faf0: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
fb00: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
fb10: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
fb20: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
fb30: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
fb40: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
fb50: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
fb60: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
fb70: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
fb80: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
fb90: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
fba0: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
fbb0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
fbc0: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
fbd0: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
fbe0: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
fbf0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
fc00: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
fc10: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
fc20: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
fc30: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
fc40: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
fc50: 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20  (zero).** prior 
fc60: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
fc70: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
fc80: 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73  he iOffset regis
fc90: 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74  ter (if it exist
fca0: 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  s) is initialize
fcb0: 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a  d to the value.*
fcc0: 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e  * of the OFFSET.
fcd0: 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67    The iLimit reg
fce0: 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
fcf0: 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20  ized to LIMIT.  
fd00: 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66  Register.** iOff
fd10: 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c  set+1 is initial
fd20: 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46  ized to LIMIT+OF
fd30: 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  FSET..**.** Only
fd40: 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72   if pLimit!=0 or
fd50: 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74   pOffset!=0 do t
fd60: 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
fd70: 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
fd80: 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
fd90: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
fda0: 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
fdb0: 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
fdc0: 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
fdd0: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
fde0: 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
fdf0: 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
fe00: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fe10: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
fe20: 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
fe30: 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
fe40: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
fe50: 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
fe60: 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
fe70: 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
fe80: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
fe90: 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d   int n;.  if( p-
fea0: 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
feb0: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
fec0: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
fed0: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
fee0: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
fef0: 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20   ** controversy 
ff00: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
ff10: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
ff20: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
ff30: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
ff40: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
ff50: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
ff60: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
ff70: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rows..  */.  sql
ff80: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
ff90: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  ar(pParse);.  as
ffa0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
ffb0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74  ==0 || p->pLimit
ffc0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
ffd0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
ffe0: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
fff0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10000 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
10010 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
10020 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
10030 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73  !=0 );.    if( s
10040 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
10050 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26  ger(p->pLimit, &
10060 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
10070 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10080 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
10090 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
100a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
100b0 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
100c0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
100d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
100e0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69  te3VdbeGoto(v, i
100f0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65  Break);.      }e
10100 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20  lse if( n>=0 && 
10110 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71  p->nSelectRow>sq
10120 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
10130 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  )n) ){.        p
10140 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
10150 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
10160 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  4)n);.        p-
10170 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
10180 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20  FixedLimit;.    
10190 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
101a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
101b0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
101c0 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b  pLimit, iLimit);
101d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
101e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
101f0 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74  ustBeInt, iLimit
10200 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
10210 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
10220 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
10230 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
10240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10250 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
10260 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
10270 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
10280 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  v);.    }.    if
10290 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
102a0 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
102b0 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70   = iOffset = ++p
102c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
102d0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b     pParse->nMem+
102e0 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  +;   /* Allocate
102f0 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74   an extra regist
10300 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66  er for limit+off
10310 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  set */.      sql
10320 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10330 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  rse, p->pOffset,
10340 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
10350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10360 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
10370 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64  nt, iOffset); Vd
10380 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
10390 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
103a0 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75  ((v, "OFFSET cou
103b0 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
103c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
103d0 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d  (v, OP_OffsetLim
103e0 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66  it, iLimit, iOff
103f0 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b  set+1, iOffset);
10400 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
10410 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46  nt((v, "LIMIT+OF
10420 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20  FSET"));.    }. 
10430 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
10440 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
10450 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
10460 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
10470 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
10480 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
10490 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
104a0 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
104b0 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
104c0 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
104d0 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
104e0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
104f0 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
10500 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
10510 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
10520 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
10530 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
10540 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
10550 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
10560 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
10570 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
10580 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
10590 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
105a0 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
105b0 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
105c0 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
105d0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
105e0 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
105f0 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
10600 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
10610 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
10620 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
10630 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
10640 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
10650 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
10660 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10670 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20  iCol>=0 );.  /* 
10680 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73  iCol must be les
10690 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74  s than p->pEList
106a0 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77  ->nExpr.  Otherw
106b0 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75  ise an error wou
106c0 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ld.  ** have bee
106d0 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20  n thrown during 
106e0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
106f0 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74  and we would not
10700 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a   have gotten.  *
10710 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20  * this far */.  
10720 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41  if( pRet==0 && A
10730 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45  LWAYS(iCol<p->pE
10740 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
10750 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
10760 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
10770 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
10780 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
10790 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
107a0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
107b0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
107c0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
107d0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
107e0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
107f0 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e  ELECT.** with an
10800 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
10810 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10820 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65  allocates and re
10830 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a  turns a KeyInfo.
10840 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73 75 69  ** structure sui
10850 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d  table for implem
10860 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
10870 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65   BY..**.** Space
10880 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
10890 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
108a0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
108b0 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c  malloc. The call
108c0 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
108d0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
108e0 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  or ensuring that
108f0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
10900 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
10910 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
10920 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69  c KeyInfo *multi
10930 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
10940 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
10950 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
10960 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78  nt nExtra){.  Ex
10970 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
10980 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
10990 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d    int nOrderBy =
109a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45   p->pOrderBy->nE
109b0 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr;.  sqlite3 *
109c0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
109d0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74  .  KeyInfo *pRet
109e0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
109f0 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65  oAlloc(db, nOrde
10a00 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a  rBy+nExtra, 1);.
10a10 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
10a20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
10a30 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
10a40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
10a50 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
10a60 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72  em *pItem = &pOr
10a70 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20  derBy->a[i];.   
10a80 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d     Expr *pTerm =
10a90 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
10aa0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
10ab0 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  oll;..      if( 
10ac0 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
10ad0 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
10ae0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
10af0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
10b00 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a  pParse, pTerm);.
10b10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10b20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c       pColl = mul
10b30 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
10b40 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d  pParse, p, pItem
10b50 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
10b60 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l-1);.        if
10b70 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f  ( pColl==0 ) pCo
10b80 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
10b90 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  ll;.        pOrd
10ba0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
10bb0 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   =.          sql
10bc0 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
10bd0 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c  teString(pParse,
10be0 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a   pTerm, pColl->z
10bf0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
10c00 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
10c10 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
10c20 74 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a  teable(pRet) );.
10c30 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c        pRet->aCol
10c40 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
10c50 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f      pRet->aSortO
10c60 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72  rder[i] = pOrder
10c70 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
10c80 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  er;.    }.  }.. 
10c90 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
10ca0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10cb0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54  OMIT_CTE./*.** T
10cc0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
10cd0 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20  rates VDBE code 
10ce0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
10cf0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48  ontent of a WITH
10d00 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75   RECURSIVE.** qu
10d10 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ery of the form:
10d20 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73  .**.**   <recurs
10d30 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c  ive-table> AS (<
10d40 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49  setup-query> UNI
10d50 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73  ON [ALL] <recurs
10d60 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20  ive-query>).**  
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
10d90 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20  ___/            
10da0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
10db0 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dd0 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20  p->pPrior       
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10df0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  .**.**.** There 
10e00 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72  is exactly one r
10e10 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
10e20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
10e30 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
10e40 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69  se.** of recursi
10e50 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64  ve-query, marked
10e60 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73   with the SrcLis
10e70 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75  t->a[].fg.isRecu
10e80 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a  rsive flag..**.*
10e90 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72  * The setup-quer
10ea0 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67  y runs once to g
10eb0 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69  enerate an initi
10ec0 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74  al set of rows t
10ed0 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61  hat go.** into a
10ee0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52   Queue table.  R
10ef0 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ows are extracte
10f00 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65  d from the Queue
10f10 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a   table one by.**
10f20 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20   one.  Each row 
10f30 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
10f40 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74  ueue is output t
10f50 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74  o pDest.  Then t
10f60 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74  he single.** ext
10f70 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20  racted row (now 
10f80 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20  in the iCurrent 
10f90 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74  table) becomes t
10fa0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
10fb0 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74  e.** recursive-t
10fc0 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72  able for a recur
10fd0 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20  sive-query run. 
10fe0 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   The output of t
10ff0 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  he recursive-que
11000 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62  ry.** is added b
11010 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ack into the Que
11020 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20  ue table.  Then 
11030 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65  another row is e
11040 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
11050 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  eue.** and the i
11060 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  teration continu
11070 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  es until the Que
11080 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  ue table is empt
11090 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
110a0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f  compound query o
110b0 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
110c0 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61   then no duplica
110d0 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72  te rows are ever
110e0 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
110f0 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  o the Queue tabl
11100 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63  e.  The iDistinc
11110 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20  t table keeps a 
11120 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73  copy of all rows
11130 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76  .** that have ev
11140 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  er been inserted
11150 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20   into Queue and 
11160 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65  causes duplicate
11170 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61  s to be.** disca
11180 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70  rded.  If the op
11190 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
111a0 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63  ALL, then duplic
111b0 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ates are allowed
111c0 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
111d0 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44  query has an ORD
111e0 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72  ER BY, then entr
111f0 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65  ies in the Queue
11200 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20   table are kept 
11210 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f  in.** ORDER BY o
11220 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72  rder and the fir
11230 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72  st entry is extr
11240 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63  acted for each c
11250 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a  ycle.  Without.*
11260 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  * an ORDER BY, t
11270 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
11280 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a  s just a FIFO..*
11290 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20  *.** If a LIMIT 
112a0 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64  clause is provid
112b0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ed, then the ite
112c0 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74  ration stops aft
112d0 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a  er LIMIT rows.**
112e0 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75   have been outpu
112f0 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c  t to pDest.  A L
11300 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61  IMIT of zero mea
11310 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20  ns to output no 
11320 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65  rows and a.** ne
11330 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61  gative LIMIT mea
11340 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c  ns to output all
11350 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65   rows.  If there
11360 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53   is also an OFFS
11370 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74  ET clause.** wit
11380 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  h a positive val
11390 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ue, then the fir
113a0 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74  st OFFSET output
113b0 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  s are discarded 
113c0 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62  rather.** than b
113d0 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65  eing sent to pDe
113e0 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63  st.  The LIMIT c
113f0 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  ount does not be
11400 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20  gin until after 
11410 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68  OFFSET.** rows h
11420 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
11430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11440 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
11450 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50  ursiveQuery(.  P
11460 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11470 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11480 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
11490 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
114a0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73     /* The recurs
114b0 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65  ive SELECT to be
114c0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
114d0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
114e0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
114f0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
11500 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  ts */.){.  SrcLi
11510 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
11520 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
11530 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
11540 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65  he recursive que
11550 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ry */.  int nCol
11560 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
11570 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  xpr;  /* Number 
11580 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
11590 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  e recursive tabl
115a0 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
115b0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
115c0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
115d0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
115e0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
115f0 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
11600 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f  Setup = p->pPrio
11610 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75  r;   /* The setu
11620 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  p query */.  int
11630 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
11640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
11650 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  p of the loop */
11660 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c  .  int addrCont,
11670 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20   addrBreak;     
11680 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64   /* CONTINUE and
11690 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73   BREAK addresses
116a0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65   */.  int iCurre
116b0 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
116c0 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65      /* The Curre
116d0 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
116e0 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20  t regCurrent;   
116f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11700 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
11710 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
11720 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20  .  int iQueue;  
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11740 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61   /* The Queue ta
11750 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69  ble */.  int iDi
11760 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20  stinct = 0;     
11770 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73         /* To ens
11780 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c  ure unique resul
11790 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20  ts if UNION */. 
117a0 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54   int eDest = SRT
117b0 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  _Fifo;         /
117c0 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74  * How to write t
117d0 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c  o Queue */.  Sel
117e0 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75  ectDest destQueu
117f0 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
11800 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74  lectDest targett
11810 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61  ing the Queue ta
11820 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
11850 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
11860 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11880 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78  ult code */.  Ex
11890 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
118a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
118b0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
118c0 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  se */.  Expr *pL
118d0 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
118e0 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c        /* Saved L
118f0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
11900 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
11910 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20  t, regOffset;   
11920 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
11930 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e  used by LIMIT an
11940 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f  d OFFSET */..  /
11950 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69  * Obtain authori
11960 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72  zation to do a r
11970 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
11980 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
11990 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
119a0 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
119b0 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  E, 0, 0, 0) ) re
119c0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63  turn;..  /* Proc
119d0 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ess the LIMIT an
119e0 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
119f0 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20  , if they exist 
11a00 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d  */.  addrBreak =
11a10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11a20 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
11a30 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
11a40 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64  s(pParse, p, add
11a50 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69  rBreak);.  pLimi
11a60 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
11a70 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
11a80 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69  ffset;.  regLimi
11a90 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
11aa0 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
11ab0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
11ac0 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  imit = p->pOffse
11ad0 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d  t = 0;.  p->iLim
11ae0 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20  it = p->iOffset 
11af0 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  = 0;.  pOrderBy 
11b00 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
11b10 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
11b20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
11b30 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   the Current tab
11b40 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  le */.  for(i=0;
11b50 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e   ALWAYS(i<pSrc->
11b60 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  nSrc); i++){.   
11b70 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e   if( pSrc->a[i].
11b80 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29  fg.isRecursive )
11b90 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e 74  {.      iCurrent
11ba0 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43   = pSrc->a[i].iC
11bb0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65  ursor;.      bre
11bc0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11bd0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72   /* Allocate cur
11be0 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72  sors numbers for
11bf0 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74 69   Queue and Disti
11c00 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nct.  The cursor
11c10 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a   number for.  **
11c20 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74 61   the Distinct ta
11c30 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61 63  ble must be exac
11c40 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20  tly one greater 
11c50 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72  than Queue in or
11c60 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  der.  ** for the
11c70 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e   SRT_DistFifo an
11c80 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  d SRT_DistQueue 
11c90 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20  destinations to 
11ca0 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75  work. */.  iQueu
11cb0 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
11cc0 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ++;.  if( p->op=
11cd0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
11ce0 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42   eDest = pOrderB
11cf0 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75  y ? SRT_DistQueu
11d00 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f  e : SRT_DistFifo
11d10 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74 20  ;.    iDistinct 
11d20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
11d30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  ;.  }else{.    e
11d40 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
11d50 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52  ? SRT_Queue : SR
11d60 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71  T_Fifo;.  }.  sq
11d70 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
11d80 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c 20  nit(&destQueue, 
11d90 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a  eDest, iQueue);.
11da0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
11db0 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65  ursors for Curre
11dc0 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44  nt, Queue, and D
11dd0 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65  istinct. */.  re
11de0 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61  gCurrent = ++pPa
11df0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
11e00 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11e10 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
11e20 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75   iCurrent, regCu
11e30 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rrent, nCol);.  
11e40 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
11e50 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
11e60 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c  yInfo = multiSel
11e70 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
11e80 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
11e90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11ea0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
11eb0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
11ec0 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
11ed0 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
11f00 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
11f10 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64    destQueue.pOrd
11f20 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
11f30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
11f40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11f50 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
11f60 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f  ral, iQueue, nCo
11f70 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f  l);.  }.  VdbeCo
11f80 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65  mment((v, "Queue
11f90 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28   table"));.  if(
11fa0 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20   iDistinct ){.  
11fb0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
11fc0 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  m[0] = sqlite3Vd
11fd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
11fe0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44  penEphemeral, iD
11ff0 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20  istinct, 0);.   
12000 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
12010 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
12020 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61  ;.  }..  /* Deta
12030 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
12040 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
12050 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
12060 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
12070 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72   = 0;..  /* Stor
12080 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
12090 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72 79   the setup-query
120a0 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20   in Queue. */.  
120b0 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20  pSetup->pNext = 
120c0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
120d0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
120e0 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65  pSetup, &destQue
120f0 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70  ue);.  pSetup->p
12100 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20  Next = p;.  if( 
12110 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  rc ) goto end_of
12120 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
12130 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
12140 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
12150 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75   Queue and outpu
12160 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20  t that row */.  
12170 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
12180 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12190 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65  P_Rewind, iQueue
121a0 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64  , addrBreak); Vd
121b0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
121c0 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
121d0 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75  e next row in Qu
121e0 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72  eue over to Curr
121f0 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
12200 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12210 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65  _NullRow, iCurre
12220 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74  nt); /* To reset
12230 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f   column cache */
12240 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
12250 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12260 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
12270 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70  olumn, iQueue, p
12280 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
12290 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
122a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
122b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
122c0 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75   OP_RowData, iQu
122d0 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29  eue, regCurrent)
122e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
122f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12300 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b  Delete, iQueue);
12310 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
12320 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
12330 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64  Current */.  add
12340 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  rCont = sqlite3V
12350 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
12360 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
12370 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72   regOffset, addr
12380 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49  Cont);.  selectI
12390 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
123a0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69   p, p->pEList, i
123b0 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30  Current,.      0
123c0 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72  , 0, pDest, addr
123d0 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29  Cont, addrBreak)
123e0 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74  ;.  if( regLimit
123f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
12400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12410 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65  DecrJumpZero, re
12420 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61  gLimit, addrBrea
12430 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
12440 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73  rage(v);.  }.  s
12450 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
12460 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
12470 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75  nt);..  /* Execu
12480 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76 65  te the recursive
12490 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74   SELECT taking t
124a0 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
124b0 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a   Current as.  **
124c0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
124d0 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  he recursive-tab
124e0 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65  le. Store the re
124f0 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65  sults in the Que
12500 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ue..  */.  if( p
12510 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
12520 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20  Aggregate ){.   
12530 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12540 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72 73  (pParse, "recurs
12550 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71 75  ive aggregate qu
12560 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f 72  eries not suppor
12570 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ted");.  }else{.
12580 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
12590 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
125a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
125b0 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20  &destQueue);.   
125c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
125d0 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  or==0 );.    p->
125e0 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b  pPrior = pSetup;
125f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  .  }..  /* Keep 
12600 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70  running the loop
12610 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
12620 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73   is empty */.  s
12630 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
12640 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
12650 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
12660 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
12670 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63  ak);..end_of_rec
12680 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20  ursive_query:.  
12690 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
126a0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
126b0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
126c0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
126d0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70  pOrderBy;.  p->p
126e0 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
126f0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
12700 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  Offset;.  return
12710 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12720 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
12730 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
12740 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69  erences */.stati
12750 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
12760 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
12770 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12780 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
12790 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
127a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
127b0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
127c0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
127d0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
127e0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
127f0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
12800 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
12810 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  ults */.);../*.*
12820 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65  * Handle the spe
12830 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63  cial case of a c
12840 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74  ompound-select t
12850 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  hat originates f
12860 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20  rom a.** VALUES 
12870 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64  clause.  By hand
12880 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  ling this as a s
12890 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20  pecial case, we 
128a0 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65  avoid deep.** re
128b0 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75  cursion, and thu
128c0 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s do not need to
128d0 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c   enforce the SQL
128e0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
128f0 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20  ND_SELECT.** on 
12900 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  a VALUES clause.
12910 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74  .**.** Because t
12920 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
12930 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
12940 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
12950 3a 0a 2a 2a 20 20 20 28 31 29 20 49 74 20 68 61  :.**   (1) It ha
12960 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46  s no LIMIT or OF
12970 46 53 45 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c  FSET.**   (2) Al
12980 6c 20 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f  l terms are UNIO
12990 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54  N ALL.**   (3) T
129a0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
129b0 20 42 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74   BY clause.*/.st
129c0 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
129d0 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61  lectValues(.  Pa
129e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
129f0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
12a00 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
12a10 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
12a20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
12a30 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
12a40 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
12a50 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
12a60 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
12a70 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
12a80 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
12a90 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20  elect *pPrior;. 
12aa0 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20   int nRow = 1;. 
12ab0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61   int rc = 0;.  a
12ac0 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
12ad0 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
12ae0 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ue );.  do{.    
12af0 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
12b00 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
12b10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12b20 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
12b30 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  (p->op==TK_SELEC
12b40 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  T && p->pPrior==
12b50 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
12b60 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29  ( p->pLimit==0 )
12b70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
12b80 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  >pOffset==0 );. 
12b90 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
12ba0 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c  ext==0 || p->pEL
12bb0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70  ist->nExpr==p->p
12bc0 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Next->pEList->nE
12bd0 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70  xpr );.    if( p
12be0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72  ->pPrior==0 ) br
12bf0 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
12c00 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78   p->pPrior->pNex
12c10 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20  t==p );.    p = 
12c20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e  p->pPrior;.    n
12c30 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  Row++;.  }while(
12c40 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  1);.  while( p )
12c50 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  {.    pPrior = p
12c60 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
12c70 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
12c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
12c90 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
12ca0 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50  Dest);.    p->pP
12cb0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
12cc0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
12cd0 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  k;.    p->nSelec
12ce0 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  tRow = nRow;.   
12cf0 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
12d00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12d10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
12d20 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
12d30 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d  to process a com
12d40 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d  pound query form
12d50 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20   from.** two or 
12d60 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
12d70 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f  eries using UNIO
12d80 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58  N, UNION ALL, EX
12d90 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45  CEPT, or.** INTE
12da0 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20  RSECT.**.** "p" 
12db0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
12dc0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
12dd0 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
12de0 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
12df0 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
12e00 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
12e10 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
12e20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
12e30 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
12e40 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
12e50 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
12e60 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
12e70 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
12e80 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
12e90 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
12ea0 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
12eb0 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
12ec0 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
12ed0 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
12ee0 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
12ef0 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
12f00 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
12f10 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
12f20 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
12f30 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
12f40 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
12f50 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
12f60 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
12f70 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
12f80 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
12f90 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
12fa0 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
12fb0 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
12fc0 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
12fd0 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
12ff0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13000 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
13010 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
13020 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
13030 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
13040 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
13050 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
13060 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
13070 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
13080 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
13090 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
130a0 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
130b0 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
130c0 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
130d0 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
130e0 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
130f0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
13100 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
13110 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
13120 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
13130 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
13140 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
13150 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
13160 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
13170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13180 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
13190 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
131a0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
131b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
131c0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
131d0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
131e0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
131f0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
13200 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
13210 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
13220 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
13230 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
13240 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13250 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
13260 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
13270 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
13280 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
13290 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
132a0 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
132b0 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
132c0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
132d0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
132e0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
132f0 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
13300 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
13310 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20   /* Alternative 
13320 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  data destination
13330 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44   */.  Select *pD
13340 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43  elete = 0;  /* C
13350 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73  hain of simple s
13360 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65  elects to delete
13370 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
13380 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
13390 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
133a0 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  on */.#ifndef SQ
133b0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
133c0 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20  N.  int iSub1 = 
133d0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
133e0 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
133f0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
13400 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20  iSub2 = 0;      
13410 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
13420 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
13430 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  */.#endif..  /* 
13440 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
13450 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
13460 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
13470 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
13480 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
13490 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
134a0 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
134b0 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
134c0 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
134d0 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  IMIT..  */.  ass
134e0 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72  ert( p && p->pPr
134f0 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69  ior );  /* Calli
13500 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72  ng function guar
13510 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68  antees this much
13520 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
13530 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
13540 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c  Recursive)==0 ||
13550 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
13560 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  | p->op==TK_UNIO
13570 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  N );.  db = pPar
13580 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72  se->db;.  pPrior
13590 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
135a0 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20  dest = *pDest;. 
135b0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
135c0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
135d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
135e0 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c  rse,"ORDER BY cl
135f0 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
13600 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
13610 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
13620 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
13630 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
13640 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
13650 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
13660 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
13670 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
13680 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13690 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73  ,"LIMIT clause s
136a0 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
136b0 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
136c0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
136d0 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
136e0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
136f0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13700 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73  nd;.  }..  v = s
13710 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13720 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
13730 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65   v!=0 );  /* The
13740 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72   VDBE already cr
13750 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  eated by calling
13760 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
13770 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
13780 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
13790 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
137a0 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
137b0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
137c0 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
137d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
137e0 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
137f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13800 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
13810 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20  , dest.iSDParm, 
13820 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
13830 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
13840 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
13850 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
13860 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20   handling for a 
13870 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
13880 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
13890 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  as a VALUES clau
138a0 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
138b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
138c0 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20  MultiValue ){.  
138d0 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
138e0 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c  ctValues(pParse,
138f0 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
13900 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
13910 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
13920 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
13930 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
13940 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
13950 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
13960 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
13970 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
13980 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
13990 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
139a0 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
139b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
139c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50  EList->nExpr==pP
139d0 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
139e0 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  xpr );..#ifndef 
139f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
13a00 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
13a10 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
13a20 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
13a30 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
13a40 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ry(pParse, p, &d
13a50 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  est);.  }else.#e
13a60 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f  ndif..  /* Compo
13a70 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74  und SELECTs that
13a80 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
13a90 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e  Y clause are han
13aa0 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  dled separately.
13ab0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
13ac0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
13ad0 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
13ae0 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  tOrderBy(pParse,
13af0 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65   p, pDest);.  }e
13b00 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  lse..  /* Genera
13b10 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
13b20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
13b30 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
13b40 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
13b50 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
13b60 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
13b70 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
13b80 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
13b90 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
13ba0 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
13bb0 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
13bc0 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  ->iLimit = p->iL
13bd0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
13be0 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d  or->iOffset = p-
13bf0 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
13c00 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
13c10 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
13c20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
13c30 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
13c40 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
13c50 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
13c60 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
13c70 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
13c80 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
13c90 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
13ca0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  &dest);.      p-
13cb0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
13cc0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
13cd0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  0;.      if( rc 
13ce0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
13cf0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13d00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13d10 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
13d20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
13d30 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
13d40 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
13d50 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
13d60 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  set;.      if( p
13d70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
13d80 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
13d90 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13da0 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69  OP_IfNot, p->iLi
13db0 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
13dc0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56  ge(v);.        V
13dd0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
13de0 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49  Jump ahead if LI
13df0 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
13e00 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
13e10 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
13e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13e30 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73  ddOp3(v, OP_Offs
13e40 65 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  etLimit,.       
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e60 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20       p->iLimit, 
13e70 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d  p->iOffset+1, p-
13e80 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  >iOffset);.     
13e90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13ea0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
13eb0 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
13ec0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
13ed0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
13ee0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13ef0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
13f00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13f10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
13f20 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
13f30 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
13f40 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
13f50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  rior;.      p->n
13f60 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
13f70 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
13f80 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
13f90 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
13fa0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
13fb0 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20  r->pLimit.      
13fc0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
13fd0 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d  sInteger(pPrior-
13fe0 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74  >pLimit, &nLimit
13ff0 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d  ).       && nLim
14000 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  it>0 && p->nSele
14010 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c  ctRow > sqlite3L
14020 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69  ogEst((u64)nLimi
14030 74 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  t) .      ){.   
14040 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
14050 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
14060 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b  st((u64)nLimit);
14070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14080 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
14090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
140a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
140b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
140c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
140d0 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
140e0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
140f0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
14100 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
14110 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
14120 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14130 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
14140 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f  lt */.      u8 o
14150 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  p = 0;       /* 
14160 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
14170 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
14180 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
14190 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
141a0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
141b0 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
141c0 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
141d0 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
141e0 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
141f0 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
14200 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
14210 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
14220 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
14230 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
14240 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
14250 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ;..      testcas
14260 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
14270 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  EPT );.      tes
14280 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
14290 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
142a0 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e  priorOp = SRT_Un
142b0 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ion;.      if( d
142c0 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72  est.eDest==prior
142d0 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Op ){.        /*
142e0 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
142f0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
14300 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
14310 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
14320 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
14330 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
14340 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
14350 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  mit==0 );      /
14360 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
14370 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
14380 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
14390 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
143a0 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f  ==0 );     /* No
143b0 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
143c0 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
143d0 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
143e0 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
143f0 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
14400 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
14410 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
14420 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
14430 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
14440 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
14450 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
14460 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
14470 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
14480 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
14490 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
144a0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
144b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
144c0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
144d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
144e0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
144f0 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
14500 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
14510 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
14520 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
14530 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
14540 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
14550 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
14560 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
14570 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
14580 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14590 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
145a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
145b0 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
145c0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
145d0 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
145e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
145f0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
14600 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14610 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
14620 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f  &uniondest, prio
14630 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a  rOp, unionTab);.
14640 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
14650 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
14660 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
14670 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
14680 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
14690 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
146a0 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
146b0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
146c0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
146d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
146e0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
146f0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
14700 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
14710 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
14720 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  f( p->op==TK_EXC
14730 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EPT ){.        o
14740 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a  p = SRT_Except;.
14750 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14760 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14770 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
14780 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
14790 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a  _Union;.      }.
147a0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
147b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
147c0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
147d0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
147e0 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
147f0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
14800 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14810 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f   = 0;.      unio
14820 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70  ndest.eDest = op
14830 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
14840 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
14850 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14860 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
14870 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
14880 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e  t(pParse, p, &un
14890 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
148a0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
148b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
148c0 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
148d0 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
148e0 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
148f0 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
14900 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
14910 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
14920 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
14930 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
14940 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
14950 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14960 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
14970 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
14980 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
14990 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
149a0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
149b0 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
149c0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
149d0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
149e0 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ION ){.        p
149f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
14a00 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
14a10 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
14a20 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
14a30 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
14a40 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
14a50 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
14a60 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
14a70 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
14a80 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14a90 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
14aa0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
14ab0 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
14ac0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  = 0;..      /* C
14ad0 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
14ae0 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
14af0 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
14b00 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
14b10 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
14b20 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
14b30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14b40 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
14b50 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
14b60 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
14b70 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69  iorOp );.      i
14b80 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
14b90 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
14ba0 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
14bb0 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
14bc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14bd0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
14be0 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
14bf0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
14c00 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
14c10 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
14c20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
14c30 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
14c40 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
14c50 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
14c60 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
14c70 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
14c80 46 69 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69  First->pSrc, pFi
14c90 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
14ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14cb0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
14cc0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14cd0 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
14ce0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14cf0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
14d00 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
14d10 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
14d20 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
14d30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
14d50 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
14d60 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
14d70 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
14d80 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
14d90 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14da0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  (v);.        sel
14db0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
14dc0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
14dd0 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20  t, unionTab,.   
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
14e00 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
14e10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14e20 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
14e30 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
14e40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14e50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
14e60 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
14e70 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  art); VdbeCovera
14e80 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
14e90 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
14ea0 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
14eb0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14ec0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14ed0 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
14ee0 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
14ef0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14f00 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
14f10 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
14f20 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b  K_INTERSECT ); {
14f30 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
14f40 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
14f50 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
14f60 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
14f70 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
14f80 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
14f90 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
14fa0 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
14fb0 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
14fc0 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
14fd0 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
14fe0 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
14ff0 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
15000 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
15010 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
15020 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
15030 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
15040 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
15050 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
15060 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
15070 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
15080 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
15090 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
150a0 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
150b0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
150c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
150d0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
150e0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
150f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15100 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
15110 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
15120 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
15130 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
15140 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
15150 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
15160 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64  addr;.      find
15170 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
15180 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
15190 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
151a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
151b0 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
151c0 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
151d0 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
151e0 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
151f0 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
15200 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
15210 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
15220 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
15230 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
15240 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
15250 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
15260 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
15270 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
15280 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
15290 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
152a0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
152b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
152c0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
152d0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
152e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
152f0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
15300 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
15310 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15320 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
15330 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
15340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15350 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
15360 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
15370 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15380 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
15390 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
153a0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
153b0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
153c0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
153d0 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
153e0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
153f0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
15400 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
15410 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
15420 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
15430 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
15440 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
15450 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b2;.      explai
15460 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
15470 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
15480 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
15490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
154a0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
154b0 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
154c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
154d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
154e0 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
154f0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
15500 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
15510 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
15520 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
15530 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
15540 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
15550 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
15560 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
15570 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
15580 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
15590 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
155a0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
155b0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
155c0 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  set;..      /* G
155d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
155e0 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
155f0 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
15600 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
15610 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
15620 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
15630 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
15640 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
15650 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
15660 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
15670 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
15680 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
15690 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
156a0 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
156b0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
156c0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
156d0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 46 69  ames(pParse, pFi
156e0 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73  rst->pSrc, pFirs
156f0 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
15700 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
15710 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
15720 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
15730 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
15740 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15750 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
15760 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
15770 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
15780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15790 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
157a0 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
157b0 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
157c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72  rage(v);.      r
157d0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
157e0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
157f0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
15800 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15810 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
15820 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
15830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15840 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
15850 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
15860 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76   r1, 0); VdbeCov
15870 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
15880 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15890 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
158a0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
158b0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
158c0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
158d0 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ab1,.           
158e0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
158f0 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
15900 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
15910 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15920 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
15930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15940 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
15950 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
15960 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
15970 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15980 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15990 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
159a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
159b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
159c0 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
159d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
159e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
159f0 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
15a00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15a10 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f    }..  explainCo
15a20 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
15a30 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
15a40 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41  ub2, p->op!=TK_A
15a50 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  LL);..  /* Compu
15a60 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
15a70 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
15a80 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
15a90 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
15aa0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
15ab0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
15ac0 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
15ad0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
15ae0 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
15af0 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
15b00 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
15b10 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
15b20 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
15b30 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
15b40 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
15b50 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
15b60 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
15b70 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
15b80 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
15b90 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
15ba0 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
15bb0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
15bc0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
15bd0 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
15be0 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
15bf0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
15c00 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
15c10 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
15c20 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
15c50 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
15c60 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
15c70 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
15c80 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
15c90 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
15ca0 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
15cb0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
15cc0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
15cd0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
15ce0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
15cf0 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
15d00 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
15d10 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
15d20 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
15d30 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
15d40 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
15d70 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
15d80 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
15d90 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
15da0 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   );.    nCol = p
15db0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
15dc0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
15dd0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
15de0 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29  loc(db, nCol, 1)
15df0 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49  ;.    if( !pKeyI
15e00 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nfo ){.      rc 
15e10 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
15e20 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
15e30 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
15e50 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
15e60 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
15e70 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
15e80 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
15e90 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
15ea0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
15eb0 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
15ec0 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
15ed0 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
15ee0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
15ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
15f00 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
15f10 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
15f20 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
15f30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
15f40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
15f50 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
15f60 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
15f70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
15f80 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
15f90 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
15fa0 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
15fb0 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
15fc0 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
15fd0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
15fe0 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
15ff0 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
16000 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
16010 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
16020 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
16030 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
16040 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
16050 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
16060 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16070 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
16080 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
16090 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
160a0 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
160b0 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
160c0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
160d0 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
16100 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
16110 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
16120 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
16130 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79  }.    sqlite3Key
16140 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
16150 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
16160 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
16170 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
16180 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
16190 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
161a0 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
161b0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
161c0 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
161d0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
161e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
161f0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
16200 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d  /../*.** Error m
16210 65 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20  essage for when 
16220 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  two or more term
16230 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  s of a compound 
16240 73 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66  select have diff
16250 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65  erent.** size re
16260 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f  sult sets..*/.vo
16270 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
16280 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72  WrongNumTermsErr
16290 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
162a0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
162b0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
162c0 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
162d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
162e0 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20  sg(pParse, "all 
162f0 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65  VALUES must have
16300 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
16310 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d   of terms");.  }
16320 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
16330 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16340 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
16350 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
16360 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
16370 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
16380 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
16390 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
163a0 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
163b0 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  op));.  }.}../*.
163c0 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
163d0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
163e0 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
163f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
16400 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
16410 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
16420 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
16430 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
16440 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68   pIn->iSdst.  Th
16450 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e  ere are.** pIn->
16460 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f  nSdst columns to
16470 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
16480 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
16490 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
164a0 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
164b0 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
164c0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
164d0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
164e0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
164f0 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
16500 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
16510 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
16520 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
16530 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
16540 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
16550 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
16560 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
16570 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
16580 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
16590 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
165a0 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
165b0 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
165c0 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
165d0 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
165e0 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
165f0 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
16600 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
16610 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
16620 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
16630 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
16640 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
16650 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
16660 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
16670 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
16680 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
16690 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
166a0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
166b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
166c0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
166d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
166e0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
166f0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
16700 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
16710 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
16720 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
16730 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
16740 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
16750 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
16760 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
16770 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
16780 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
16790 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
167a0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
167b0 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
167c0 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
167d0 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
167e0 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
167f0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
16800 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
16810 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
16820 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
16830 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ry */.  int iBre
16840 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
16850 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
16860 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
16870 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
16880 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
16890 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
168a0 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
168b0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
168c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
168d0 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
168e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
168f0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
16900 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
16910 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
16920 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
16930 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
16940 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
16950 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
16960 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  2;.    addr1 = s
16970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16980 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
16990 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65  gPrev); VdbeCove
169a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64  rage(v);.    add
169b0 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
169c0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
169d0 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  pare, pIn->iSdst
169e0 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
169f0 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20  ->nSdst,.       
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
16a20 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
16a30 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
16a40 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
16a50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16a60 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b   OP_Jump, addr2+
16a70 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64  2, iContinue, ad
16a80 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65  dr2+2); VdbeCove
16a90 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
16aa0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16ab0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
16ac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ad0 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49  3(v, OP_Copy, pI
16ae0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
16af0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d  v+1, pIn->nSdst-
16b00 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
16b10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16b20 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
16b30 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
16b40 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
16b50 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
16b60 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
16b70 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46  ess the first OF
16b80 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
16b90 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
16ba0 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
16bb0 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
16bc0 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
16bd0 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  inue);..  assert
16be0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  ( pDest->eDest!=
16bf0 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20  SRT_Exists );.  
16c00 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
16c10 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
16c20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  );.  switch( pDe
16c30 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
16c40 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
16c50 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
16c60 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
16c70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16c80 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
16c90 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
16ca0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16cb0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16cc0 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
16cd0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16ce0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
16cf0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16d00 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
16d10 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
16d20 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
16d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16d40 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
16d50 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
16d60 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
16d70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16d80 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
16d90 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
16da0 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
16db0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16dc0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
16dd0 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
16de0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16df0 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
16e00 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
16e10 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16e20 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
16e30 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
16e40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16e50 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
16e60 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
16e70 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
16e80 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
16e90 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
16ea0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
16eb0 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
16ec0 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
16ed0 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
16ee0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
16ef0 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
16f00 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
16f10 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
16f20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
16f30 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
16f40 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16f50 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
16f60 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
16f70 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
16f80 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20  dst = .         
16f90 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
16fa0 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
16fb0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
16fc0 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
16fd0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
16fe0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16ff0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
17000 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17010 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
17020 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31  In->iSdst, 1, r1
17030 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73  , &pDest->affSds
17040 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t,1);.      sqli
17050 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
17060 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
17070 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  e, pIn->iSdst, 1
17080 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17090 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
170a0 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73  _IdxInsert, pDes
170b0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b  t->iSDParm, r1);
170c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
170d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
170e0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
170f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
17100 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
17110 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
17120 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
17130 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
17140 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
17150 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
17160 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
17170 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
17180 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
17190 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
171a0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
171b0 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
171c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
171d0 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61  >nSdst==1 || pPa
171e0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20  rse->nErr>0 );  
171f0 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e  testcase( pIn->n
17200 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst!=1 );.     
17210 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17220 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
17230 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
17240 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
17250 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
17260 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
17270 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
17280 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
17290 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
172a0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
172b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
172c0 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
172d0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
172e0 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
172f0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
17300 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
17310 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
17320 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
17330 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
17340 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17350 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
17360 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
17370 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
17380 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
17390 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
173a0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
173b0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
173c0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
173d0 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
173e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
173f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
17400 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
17410 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
17420 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
17430 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17440 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17450 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
17460 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
17470 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
17480 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
17490 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
174a0 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
174b0 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
174c0 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
174d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
174e0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
174f0 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
17500 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
17510 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
17520 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
17530 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
17540 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
17550 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
17560 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
17570 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
17580 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
17590 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
175a0 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
175b0 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
175c0 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
175d0 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
175e0 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
175f0 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
17600 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
17610 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
17620 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
17630 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
17640 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17650 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
17660 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
17670 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17680 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17690 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
176a0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
176b0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
176c0 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
176d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
176e0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
176f0 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
17700 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
17710 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
17720 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
17730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17740 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
17750 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  umpZero, p->iLim
17760 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
17770 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17780 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
17790 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
177a0 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
177b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
177c0 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
177d0 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
177e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
177f0 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
17800 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
17810 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
17820 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
17830 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
17840 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
17850 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
17860 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
17870 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
17880 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
17890 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
178a0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
178b0 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
178c0 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
178d0 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
178e0 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
178f0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
17900 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
17910 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
17920 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
17930 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
17940 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
17950 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
17960 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
17970 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
17980 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
17990 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
179a0 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
179b0 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
179c0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
179d0 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
179e0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
179f0 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
17a00 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
17a10 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
17a20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
17a30 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
17a40 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
17a50 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
17a60 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
17a70 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
17a80 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
17a90 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
17aa0 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
17ab0 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
17ac0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
17ad0 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
17ae0 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
17af0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
17b00 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
17b10 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
17b20 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
17b30 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
17b40 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
17b50 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
17b60 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
17b70 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
17b80 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
17b90 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
17ba0 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
17bb0 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
17bc0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
17bd0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
17be0 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
17bf0 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
17c00 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
17c10 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
17c20 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
17c30 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
17c40 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
17c50 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
17c60 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
17c70 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
17c80 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
17c90 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
17ca0 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
17cb0 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
17cc0 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
17cd0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17ce0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
17cf0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
17d00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
17d10 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
17d20 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
17d30 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
17d40 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
17d50 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
17d60 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
17d70 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
17d80 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
17d90 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
17da0 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
17db0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
17dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
17dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
17de0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
17df0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17e00 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
17e10 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
17e20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
17e30 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17e40 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
17e50 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
17e60 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
17e70 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
17e80 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
17e90 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
17ea0 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
17eb0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17ec0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
17ed0 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
17ee0 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
17ef0 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
17f00 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
17f10 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
17f20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
17f30 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
17f40 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
17f50 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
17f60 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
17f70 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
17f80 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
17f90 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
17fa0 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
17fb0 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
17fc0 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
17fd0 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
17fe0 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
17ff0 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
18000 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
18010 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
18020 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
18030 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
18040 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
18050 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
18060 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
18070 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
18080 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
18090 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
180a0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
180b0 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
180c0 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
180d0 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
180e0 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
180f0 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
18100 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
18110 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
18120 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
18130 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
18140 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
18150 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
18160 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
18170 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
18180 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
18190 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
181a0 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
181b0 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
181c0 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
181d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
181e0 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
181f0 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
18200 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
18210 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
18220 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
18230 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
18240 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
18250 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
18260 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
18270 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
18280 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
18290 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
182a0 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
182b0 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
182c0 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
182d0 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
182e0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
182f0 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
18300 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
18310 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
18320 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
18330 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
18340 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
18350 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
18360 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
18370 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
18380 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
18390 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
183a0 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
183b0 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
183c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
183d0 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
183e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
183f0 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
18400 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
18410 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
18420 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
18430 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
18440 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
18450 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
18460 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
18470 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
18480 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
18490 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
184a0 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
184b0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
184c0 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
184d0 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
184e0 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
184f0 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
18500 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
18510 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
18520 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
18530 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
18540 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
18550 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
18560 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
18570 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
18580 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18590 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
185a0 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
185b0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
185c0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
185d0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
185e0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
185f0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
18600 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18610 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
18620 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
18630 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
18640 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
18650 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
18660 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
18670 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
18680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18690 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
186a0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
186b0 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
186c0 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
186d0 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
186e0 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18700 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
18710 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
18720 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
18730 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
18740 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
18750 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
18760 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
18770 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
18780 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
18790 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
187a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
187b0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
187c0 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
187d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
187e0 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
187f0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
18800 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
18810 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18820 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
18830 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18840 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
18850 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18860 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
18870 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18880 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
18890 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
188a0 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
188b0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
188c0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
188d0 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
188e0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
188f0 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
18900 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
18910 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
18920 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
18930 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
18940 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
18950 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
18960 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
18970 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
18980 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
18990 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
189a0 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
189b0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
189c0 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
189d0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
189e0 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
189f0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
18a00 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f  .  int addrEofA_
18a10 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65  noB;     /* Alte
18a20 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69  rnate addrEofA i
18a30 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  f B is uninitial
18a40 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ized */.  int ad
18a50 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
18a60 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18a70 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
18a80 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
18a90 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
18aa0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18ab0 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
18ac0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18ad0 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
18ae0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18af0 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
18b00 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18b10 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
18b20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18b30 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
18b40 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
18b50 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
18b60 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
18b70 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
18b80 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
18b90 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
18ba0 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
18bb0 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
18bc0 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
18bd0 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
18be0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
18bf0 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
18c00 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
18c10 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
18c20 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
18c30 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
18c40 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
18c50 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
18c60 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
18c70 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
18c80 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
18c90 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
18ca0 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
18cb0 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
18cc0 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
18cd0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
18ce0 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
18cf0 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
18d00 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
18d10 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
18d20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
18d30 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
18d40 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
18d50 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
18d60 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
18d70 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
18d80 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
18d90 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
18da0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
18db0 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
18dc0 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
18dd0 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
18de0 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
18df0 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
18e00 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
18e10 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
18e20 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
18e30 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
18e40 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18e50 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18e60 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
18e70 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
18e80 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18e90 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
18ea0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
18eb0 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18ec0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18ed0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
18ee0 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
18ef0 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
18f00 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
18f10 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
18f20 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
18f30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
18f40 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
18f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
18f60 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
18f70 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
18f80 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
18f90 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
18fa0 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
18fb0 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
18fc0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
18fd0 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
18fe0 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
18ff0 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
19000 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
19010 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
19020 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
19030 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
19040 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
19050 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
19060 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
19070 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
19080 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
19090 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
190a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
190b0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
190c0 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
190d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
190e0 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
190f0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
19100 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
19110 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
19120 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
19130 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
19140 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
19150 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
19160 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
19170 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
19180 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
19190 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
191a0 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
191b0 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
191c0 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
191d0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
191e0 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
191f0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
19200 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
19210 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
19220 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
19230 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
19240 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
19250 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
19260 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
19270 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
19280 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
19290 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
192a0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
192b0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
192c0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
192d0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
192e0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
192f0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
19300 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
19310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
19320 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
19330 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
19340 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
19350 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
19360 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
19370 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
19380 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
19390 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
193a0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
193b0 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
193c0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
193d0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
193e0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
193f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
19400 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
19410 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
19420 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20  >u.iValue = i;. 
19430 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20         pOrderBy 
19440 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
19450 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
19460 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
19470 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
19480 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
19490 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
194a0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
194b0 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
194c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
194d0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
194e0 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
194f0 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
19500 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
19510 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
19520 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
19530 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
19540 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
19550 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
19560 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
19570 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
19580 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
19590 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
195a0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
195b0 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
195c0 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
195d0 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
195e0 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
195f0 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
19600 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
19610 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
19620 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
19630 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
19640 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
19650 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
19660 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a  nOrderBy + 1));.
19670 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
19680 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
19690 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
196a0 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b  m;.    aPermute[
196b0 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  0] = nOrderBy;. 
196c0 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65     for(i=1, pIte
196d0 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
196e0 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  <=nOrderBy; i++,
196f0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19700 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
19710 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
19720 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
19730 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
19740 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
19750 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
19760 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
19770 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
19780 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
19790 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
197a0 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
197b0 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
197c0 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
197d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
197e0 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
197f0 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
19800 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19810 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
19820 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
19830 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
19840 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
19850 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
19860 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
19870 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
19880 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
19890 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
198a0 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
198b0 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
198c0 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
198d0 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
198e0 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
198f0 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
19900 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
19910 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
19920 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
19930 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
19940 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
19950 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
19960 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
19970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
19980 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
19990 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
199a0 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
199b0 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
199c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
199d0 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
199e0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
199f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
19a00 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
19a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19a20 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
19a30 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
19a40 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
19a50 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
19a60 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
19a70 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
19a80 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
19a90 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
19aa0 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
19ab0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
19ac0 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
19ad0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
19ae0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
19af0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
19b00 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
19b10 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
19b20 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
19b30 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
19b40 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
19b50 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
19b60 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
19b70 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
19b80 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
19b90 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
19ba0 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
19bb0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
19bc0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
19bd0 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
19be0 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
19bf0 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
19c00 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
19c10 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
19c20 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
19c30 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
19c40 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
19c50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
19c60 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
19c70 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
19c80 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
19c90 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
19ca0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
19cb0 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
19cc0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
19cd0 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
19ce0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
19cf0 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
19d00 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
19d10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19d20 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
19d30 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
19d40 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
19d50 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
19d80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19d90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
19da0 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
19db0 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
19dc0 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
19dd0 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
19de0 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
19df0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
19e00 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
19e10 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
19e20 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
19e30 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
19e40 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
19e50 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
19e60 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19e70 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
19e80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19e90 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
19ea0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
19eb0 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
19ec0 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
19ed0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
19ee0 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
19ef0 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
19f00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
19f10 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
19f20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
19f30 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
19f40 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
19f50 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
19f60 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
19f70 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
19f80 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
19f90 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
19fa0 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
19fb0 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  ..  */.  addrSel
19fc0 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
19fd0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19fe0 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20   + 1;.  addr1 = 
19ff0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a000 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
1a010 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c  utine, regAddrA,
1a020 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29   0, addrSelectA)
1a030 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
1a040 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54  (v, "left SELECT
1a050 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
1a060 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
1a070 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  A;.  explainSetI
1a080 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
1a090 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
1a0a0 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
1a0b0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
1a0c0 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
1a0d0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
1a0e0 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41  oroutine(v, regA
1a0f0 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
1a100 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1a110 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65  addr1);..  /* Ge
1a120 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
1a130 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
1a140 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1a150 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
1a160 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
1a170 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
1a180 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
1a190 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1a1a0 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64  ddr(v) + 1;.  ad
1a1b0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
1a1c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
1a1d0 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
1a1e0 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65  AddrB, 0, addrSe
1a1f0 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f  lectB);.  VdbeCo
1a200 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74  mment((v, "right
1a210 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61   SELECT"));.  sa
1a220 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  vedLimit = p->iL
1a230 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66  imit;.  savedOff
1a240 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
1a250 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
1a260 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e  regLimitB;.  p->
1a270 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20  iOffset = 0;  . 
1a280 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
1a290 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
1a2a0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
1a2b0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1a2c0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
1a2d0 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  stB);.  p->iLimi
1a2e0 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a  t = savedLimit;.
1a2f0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73    p->iOffset = s
1a300 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71  avedOffset;.  sq
1a310 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
1a320 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
1a330 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
1a340 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1a350 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
1a360 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
1a370 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
1a380 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
1a390 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
1a3a0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
1a3b0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1a3c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
1a3d0 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
1a3e0 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
1a3f0 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1a400 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1a410 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1a420 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
1a430 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a450 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1a460 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1a470 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1a480 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1a490 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1a4a0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1a4b0 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
1a4c0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1a4d0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1a4e0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1a4f0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1a500 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
1a510 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
1a520 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
1a530 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
1a540 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
1a550 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
1a560 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
1a570 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1a580 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
1a590 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
1a5a0 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
1a5b0 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
1a5c0 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
1a5d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b  ;.  }.  sqlite3K
1a5e0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
1a5f0 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Dup);..  /* Gene
1a600 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1a610 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
1a620 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
1a630 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
1a640 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
1a650 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
1a660 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
1a670 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1a680 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
1a690 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1a6a0 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
1a6b0 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65   addrEofA = labe
1a6c0 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  lEnd;.  }else{  
1a6d0 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1a6e0 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
1a6f0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1a700 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
1a710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a720 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1a730 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
1a740 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
1a750 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1a760 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1a770 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62  d, regAddrB, lab
1a780 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  elEnd);.        
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
1a7b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a7c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1a7d0 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  o(v, addrEofA);.
1a7e0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
1a7f0 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
1a800 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
1a810 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
1a820 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20  ectRow);.  }..  
1a830 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1a840 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1a850 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1a860 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
1a870 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1a880 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1a890 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
1a8a0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1a8b0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1a8c0 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
1a8d0 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20   = addrEofA;.   
1a8e0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
1a8f0 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow > pPrior->nSe
1a900 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
1a910 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
1a920 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
1a930 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
1a940 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a950 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
1a960 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
1a970 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
1a980 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1a990 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
1a9a0 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
1a9b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a9c0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1a9d0 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrA, labelEnd);
1a9e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a9f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1aa00 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1aa10 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
1aa20 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1aa30 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1aa40 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
1aa50 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1aa60 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
1aa70 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
1aa80 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1aa90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1aaa0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1aab0 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
1aac0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1aad0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1aae0 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64  A, addrEofA); Vd
1aaf0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1ab00 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1ab10 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1ab20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1ab30 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1ab40 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20  e case of A==B. 
1ab50 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1ab60 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72  _ALL ){.    addr
1ab70 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1ab80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
1ab90 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1aba0 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
1abb0 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64  addrAltB;.    ad
1abc0 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73  drAltB++;.  }els
1abd0 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e{.    VdbeNoopC
1abe0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71  omment((v, "A-eq
1abf0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1ac00 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  ;.    addrAeqB =
1ac10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ac20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1ac30 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1ac40 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1ac50 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1ac60 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1ac70 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d   labelCmpr);.  }
1ac80 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1ac90 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1aca0 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20  he case of A>B. 
1acb0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1acc0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d  mment((v, "A-gt-
1acd0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1ace0 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71  .  addrAgtB = sq
1acf0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1ad00 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
1ad10 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
1ad20 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
1ad30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ad40 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1ad50 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
1ad60 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  B);.  }.  sqlite
1ad70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ad80 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1ad90 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
1ada0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1adb0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1adc0 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1add0 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
1ade0 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
1adf0 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
1ae00 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
1ae10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1ae20 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
1ae30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ae40 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1ae50 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f  drA, addrEofA_no
1ae60 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1ae70 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1ae80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1ae90 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1aea0 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1aeb0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1aec0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
1aed0 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
1aee0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1aef0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1af00 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1af10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1af20 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
1af30 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
1af40 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
1af50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
1af60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1af70 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
1af80 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
1af90 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
1afa0 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1afc0 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
1afd0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
1afe0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1aff0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d  5(v, OPFLAG_PERM
1b000 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTE);.  sqlite3V
1b010 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1b020 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
1b030 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
1b040 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  tB); VdbeCoverag
1b050 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  e(v);..  /* Jump
1b060 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
1b070 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
1b080 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
1b090 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
1b0a0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b0b0 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
1b0c0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
1b0d0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
1b0e0 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
1b0f0 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1b100 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
1b110 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
1b120 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
1b130 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
1b140 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
1b150 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
1b160 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
1b170 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
1b180 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20 70   pFirst->pSrc, p
1b190 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
1b1a0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
1b1b0 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
1b1c0 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
1b1d0 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
1b1e0 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
1b1f0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
1b200 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
1b210 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1b220 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1b230 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
1b240 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
1b250 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1b260 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1b270 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  = p;..  /*** TBD
1b280 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
1b290 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
1b2a0 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
1b2b0 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
1b2c0 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
1b2d0 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  /.  explainCompo
1b2e0 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
1b2f0 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
1b300 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  , 0);.  return p
1b310 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a  Parse->nErr!=0;.
1b320 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
1b330 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b340 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1b350 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b360 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f  OMIT_VIEW)./* Fo
1b370 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
1b380 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
1b390 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
1b3a0 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
1b3b0 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
1b3c0 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1b3d0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
1b3e0 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
1b3f0 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
1b400 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  , int);../*.** S
1b410 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
1b420 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
1b430 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
1b440 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
1b450 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
1b460 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
1b470 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
1b480 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
1b490 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
1b4a0 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
1b4b0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1b4c0 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
1b4d0 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
1b4e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b4f0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1b500 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
1b510 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
1b520 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
1b530 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
1b540 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
1b550 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
1b560 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
1b570 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
1b580 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
1b590 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
1b5a0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
1b5b0 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
1b5c0 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
1b5d0 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
1b5e0 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
1b5f0 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
1b600 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
1b610 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1b620 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
1b630 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1b640 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
1b650 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
1b660 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
1b670 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70  c Expr *substExp
1b680 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
1b690 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f  ,        /* Repo
1b6a0 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
1b6b0 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   to this connect
1b6c0 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1b6d0 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
1b6e0 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
1b6f0 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
1b700 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
1b710 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  e,         /* Ta
1b720 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
1b730 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
1b740 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
1b750 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70  * Substitute exp
1b760 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  ressions */.){. 
1b770 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1b780 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1b790 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1b7a0 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
1b7b0 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
1b7c0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1b7d0 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
1b7e0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1b7f0 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
1b800 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
1b810 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
1b820 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
1b830 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
1b840 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1b850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1b860 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
1b870 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
1b880 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
1b890 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1b8a0 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70  (db, pEList->a[p
1b8b0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
1b8c0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
1b8d0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1b8e0 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
1b8f0 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77      pExpr = pNew
1b900 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1b910 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  .    pExpr->pLef
1b920 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
1b930 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1b940 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b950 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  .    pExpr->pRig
1b960 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ht = substExpr(d
1b970 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
1b980 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b990 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
1b9a0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1b9b0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1b9c0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1b9d0 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  lect(db, pExpr->
1b9e0 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  x.pSelect, iTabl
1b9f0 65 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a 20  e, pEList, 1);. 
1ba00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ba10 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1ba20 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
1ba30 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1ba40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1ba50 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73  eturn pExpr;.}.s
1ba60 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1ba70 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69  ExprList(.  sqli
1ba80 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1ba90 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1baa0 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
1bab0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1bac0 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st,     /* List 
1bad0 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
1bae0 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1baf0 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e  stitutes */.  in
1bb00 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1bb10 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
1bb20 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
1bb30 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1bb40 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
1bb50 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
1bb60 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1bb70 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1bb80 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1bb90 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1bba0 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  i++){.    pList-
1bbb0 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75  >a[i].pExpr = su
1bbc0 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
1bbd0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
1bbe0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1bbf0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1bc00 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
1bc10 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1bc20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
1bc30 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
1bc40 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
1bc50 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
1bc60 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1bc70 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
1bc80 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
1bc90 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1bca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1bcb0 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
1bcc0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1bcd0 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20 53  *pEList,    /* S
1bce0 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
1bcf0 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f   */.  int doPrio
1bd00 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  r          /* Do
1bd10 20 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e 20   substitutes on 
1bd20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a 2f  p->pPrior too */
1bd30 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
1bd40 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Src;.  struct Sr
1bd50 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1bd60 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
1bd70 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
1bd80 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45 78   do{.    substEx
1bd90 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45  prList(db, p->pE
1bda0 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
1bdb0 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
1bdc0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
1bdd0 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65  pGroupBy, iTable
1bde0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
1bdf0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1be00 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54   p->pOrderBy, iT
1be10 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1be20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
1be30 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
1be40 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
1be50 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
1be60 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1be70 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
1be80 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  re, iTable, pELi
1be90 73 74 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  st);.    pSrc = 
1bea0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73  p->pSrc;.    ass
1beb0 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
1bec0 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
1bed0 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63  nSrc, pItem=pSrc
1bee0 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
1bef0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
1bf00 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
1bf10 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Item->pSelect, i
1bf20 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31  Table, pEList, 1
1bf30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
1bf40 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1bf50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73   ){.        subs
1bf60 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 49  tExprList(db, pI
1bf70 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1bf80 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1bf90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1bfa0 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69  .  }while( doPri
1bfb0 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50  or && (p = p->pP
1bfc0 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65  rior)!=0 );.}.#e
1bfd0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1bfe0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1bff0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1c000 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1c010 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1c020 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1c030 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1c040 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1c050 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1c060 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1c070 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1c080 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1c090 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1c0a0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1c0b0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1c0c0 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1c0d0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1c0e0 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1c0f0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1c100 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1c110 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1c120 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1c130 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1c140 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1c150 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1c160 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1c170 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1c180 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1c190 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1c1a0 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1c1b0 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1c1c0 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1c1d0 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1c1e0 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1c1f0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1c200 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1c210 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1c220 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1c230 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1c240 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1c250 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1c260 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1c270 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1c280 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1c290 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1c2a0 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1c2b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1c2c0 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1c2d0 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1c2e0 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1c2f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1c300 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1c310 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1c320 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1c330 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1c340 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1c350 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1c360 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1c370 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1c380 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1c390 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1c3a0 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1c3b0 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  plification give
1c3c0 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1c3d0 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1c3e0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1c3f0 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1c400 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1c410 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1c420 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1c430 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1c440 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1c450 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1c460 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1c470 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
1c480 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
1c490 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1c4a0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
1c4b0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1c4c0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1c4d0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1c4e0 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
1c4f0 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
1c500 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1c510 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1c520 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71  (2a) the outer q
1c530 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
1c540 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 64  in.**        and
1c550 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72 20   (2b) the outer 
1c560 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c570 73 65 20 73 75 62 71 75 65 72 69 65 73 20 6f 74  se subqueries ot
1c580 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1c590 0a 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d 2d  .**        FROM-
1c5a0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20  clause subquery 
1c5b0 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69 64  that is a candid
1c5c0 61 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e 69  ate for flatteni
1c5d0 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20 20  ng.  (2b is.**  
1c5e0 20 20 20 20 20 20 64 75 65 20 74 6f 20 74 69 63        due to tic
1c5f0 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1c600 39 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30 31  9abf80] from 201
1c610 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20  5-02-09.).**.** 
1c620 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
1c630 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
1c640 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1c650 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
1c660 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69  n.**        (Ori
1c670 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23  ginally ticket #
1c680 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e  306.  Strengthen
1c690 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33  ed by ticket #33
1c6a0 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  00).**.**   (4) 
1c6b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1c6c0 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a   not DISTINCT..*
1c6d0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
1c6e0 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
1c6f0 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
1c700 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
1c710 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
1c720 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
1c730 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
1c740 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
1c750 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
1c760 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
1c770 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
1c780 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
1c790 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
1c7a0 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
1c7b0 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  eries..**.**   (
1c7c0 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
1c7d0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1c7e0 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1c7f0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1c800 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1c810 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
1c820 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
1c830 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
1c840 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
1c850 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
1c860 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
1c870 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
1c880 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
1c890 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68  OM close with th
1c8a0 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20  e special.**    
1c8b0 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65      table sqlite
1c8c0 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69  _once that consi
1c8d0 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
1c8e0 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  row containing a
1c8f0 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c  .**        singl
1c900 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20  e NULL..**.**   
1c910 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
1c920 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1c930 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1c940 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1c950 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
1c960 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
1c970 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1c980 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1c990 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
1c9a0 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
1c9b0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1c9c0 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69   (**)  Restricti
1c9d0 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f  on (10) was remo
1c9e0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64  ved from the cod
1c9f0 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20  e on 2005-02-05 
1ca00 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20  but we.**       
1ca10 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72   accidently carr
1ca20 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  ied the comment 
1ca30 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30  forward until 20
1ca40 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69  14-09-15.  Origi
1ca50 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 65  nal.**        te
1ca60 78 74 3a 20 22 54 68 65 20 73 75 62 71 75 65 72  xt: "The subquer
1ca70 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
1ca80 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
1ca90 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a   outer query .**
1caa0 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74          does not
1cab0 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a   use LIMIT.".**.
1cac0 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
1cad0 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1cae0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1caf0 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
1cb00 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
1cb10 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69  .**  (**)  Not i
1cb20 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62  mplemented.  Sub
1cb30 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72  sumed into restr
1cb40 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73  iction (3).  Was
1cb50 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20   previously.**  
1cb60 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65        a separate
1cb70 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72   restriction der
1cb80 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65  iving from ticke
1cb90 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28  t #350..**.**  (
1cba0 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
1cbb0 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
1cbc0 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1cbd0 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
1cbe0 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
1cbf0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1cc00 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  OFFSET..**.**  (
1cc10 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  15)  The outer q
1cc20 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74  uery is not part
1cc30 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1cc40 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20  elect or the.** 
1cc50 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
1cc60 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
1cc70 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a  LIMIT clause..**
1cc80 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
1cc90 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
1cca0 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
1ccb0 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
1ccc0 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1ccd0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1cce0 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
1ccf0 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
1cd00 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
1cd10 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
1cd20 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
1cd30 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
1cd40 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
1cd50 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
1cd60 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
1cd70 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
1cd80 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
1cd90 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
1cda0 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
1cdb0 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
1cdc0 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
1cdd0 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c       compound cl
1cde0 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
1cdf0 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
1ce00 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
1ce10 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
1ce20 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
1ce30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1ce40 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
1ce50 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
1ce60 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
1ce70 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1ce80 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1ce90 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
1cea0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
1ceb0 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a  * is not a join.
1cec0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
1ced0 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
1cee0 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
1cef0 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
1cf00 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
1cf10 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
1cf20 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
1cf30 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
1cf40 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
1cf50 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
1cf60 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
1cf70 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
1cf80 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
1cf90 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1cfa0 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
1cfb0 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
1cfc0 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
1cfd0 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
1cfe0 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1cff0 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
1d000 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
1d010 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
1d020 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
1d030 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
1d040 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
1d050 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
1d060 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
1d070 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
1d080 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
1d090 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
1d0a0 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
1d0b0 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
1d0c0 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
1d0d0 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
1d0e0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
1d0f0 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
1d100 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
1d110 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
1d120 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
1d130 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
1d140 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
1d150 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
1d160 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
1d170 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1d180 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
1d190 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
1d1a0 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
1d1b0 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
1d1c0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1d1d0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1d1e0 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
1d1f0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
1d200 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f  RDER by clause o
1d210 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
1d220 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
1d230 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
1d240 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
1d250 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
1d260 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20  *.**  (19)  The 
1d270 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1d280 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1d290 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1d2a0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
1d2b0 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63    have a WHERE c
1d2c0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  lause..**.**  (2
1d2d0 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  0)  If the sub-q
1d2e0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1d2f0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1d300 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a  it must not use.
1d310 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44  **        an ORD
1d320 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ER BY clause.  T
1d330 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65  icket #3773.  We
1d340 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69   could relax thi
1d350 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  s constraint.** 
1d360 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20         somewhat 
1d370 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74  by saying that t
1d380 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
1d390 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1d3a0 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61  must.**        a
1d3b0 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66  ppear as unmodif
1d3c0 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ied result colum
1d3d0 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ns in the outer 
1d3e0 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a  query.  But we.*
1d3f0 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74  *        have ot
1d400 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
1d410 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61  s in mind to dea
1d420 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65  l with that case
1d430 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54  ..**.**  (21)  T
1d440 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1d450 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1d460 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1d470 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
1d480 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53     DISTINCT.  (S
1d490 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31  ee ticket [752e1
1d4a0 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  646fc])..**.**  
1d4b0 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65  (22)  The subque
1d4c0 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  ry is not a recu
1d4d0 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rsive CTE..**.**
1d4e0 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72 65    (23)  The pare
1d4f0 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  nt is not a recu
1d500 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68  rsive CTE, or th
1d510 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1d520 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63  ot a.**        c
1d530 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54  ompound query. T
1d540 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
1d550 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73  is because trans
1d560 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20  forming the.**  
1d570 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20        parent to 
1d580 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
1d590 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f   confuses the co
1d5a0 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a  de that handles.
1d5b0 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73  **        recurs
1d5c0 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d  ive queries in m
1d5d0 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ultiSelect()..**
1d5e0 0a 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20 73  .**  (24)  The s
1d5f0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1d600 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61 74  n aggregate that
1d610 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d   uses the built-
1d620 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20  in min() or .** 
1d630 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20         or max() 
1d640 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74  functions.  (Wit
1d650 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72 69  hout this restri
1d660 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c  ction, a query l
1d670 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22  ike:.**        "
1d680 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53  SELECT x FROM (S
1d690 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20  ELECT max(y), x 
1d6a0 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20  FROM t1)" would 
1d6b0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a  not necessarily.
1d6c0 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  **        return
1d6d0 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72   the value X for
1d6e0 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61 78   which Y was max
1d6f0 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  imal.).**.**.** 
1d700 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
1d710 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
1d720 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
1d730 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
1d740 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
1d750 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
1d760 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
1d770 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
1d780 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
1d790 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
1d7a0 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
1d7b0 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
1d7c0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
1d7d0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1d7e0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1d7f0 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
1d800 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1d810 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
1d820 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
1d830 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
1d840 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
1d850 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
1d860 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
1d870 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
1d880 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
1d890 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
1d8a0 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
1d8b0 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
1d8c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
1d8d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1d8e0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
1d8f0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d900 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
1d910 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d920 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1d930 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1d940 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
1d950 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
1d960 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
1d970 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1d980 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
1d990 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
1d9a0 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
1d9b0 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
1d9c0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
1d9d0 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
1d9e0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1d9f0 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
1da00 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
1da10 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
1da20 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
1da30 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
1da40 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1da50 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
1da60 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
1da70 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c  thContext;.  Sel
1da80 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  ect *pParent;   
1da90 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f   /* Current UNIO
1daa0 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68  N ALL term of th
1dab0 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f  e other query */
1dac0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
1dad0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1dae0 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
1daf0 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
1db00 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
1db10 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
1db20 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
1db30 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
1db40 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1db50 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
1db60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1db70 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1db80 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1db90 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
1dba0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1dbb0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1dbc0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1dbd0 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
1dbe0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
1dbf0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
1dc00 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
1dc10 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1dc20 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
1dc30 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
1dc40 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
1dc50 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1dc60 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1dc70 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
1dc80 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
1dc90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dca0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1dcb0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1dcc0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
1dcd0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
1dce0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1dcf0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1dd00 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
1dd10 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
1dd20 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1dd30 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
1dd40 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
1dd50 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
1dd60 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
1dd70 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
1dd80 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
1dd90 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
1dda0 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1ddb0 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
1ddc0 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
1ddd0 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ner) ) return 0;
1dde0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1ddf0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1de00 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
1de10 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
1de20 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
1de30 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
1de40 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
1de50 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
1de60 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
1de70 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1de80 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
1de90 29 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  );.  if( subquer
1dea0 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66  yIsAgg ){.    if
1deb0 28 20 69 73 41 67 67 20 29 20 72 65 74 75 72 6e  ( isAgg ) return
1dec0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1def0 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20 20 20 69  n (1)   */.    i
1df00 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  f( pSrc->nSrc>1 
1df10 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df30 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1df40 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20 20 20  on (2a)  */.    
1df50 69 66 28 20 28 70 2d 3e 70 57 68 65 72 65 20 26  if( (p->pWhere &
1df60 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
1df70 79 28 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f 53  y(p->pWhere,EP_S
1df80 75 62 71 75 65 72 79 29 29 0a 20 20 20 20 20 7c  ubquery)).     |
1df90 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69  | (sqlite3ExprLi
1dfa0 73 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69 73  stFlags(p->pELis
1dfb0 74 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79  t) & EP_Subquery
1dfc0 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73 71  )!=0.     || (sq
1dfd0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
1dfe0 67 73 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 20  gs(p->pOrderBy) 
1dff0 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d  & EP_Subquery)!=
1e000 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  0.    ){.      r
1e010 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e040 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e050 20 28 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d 0a   (2b)  */.    }.
1e060 20 20 7d 0a 20 20 20 20 0a 20 20 70 53 75 62 53    }.    .  pSubS
1e070 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
1e080 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
1e090 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
1e0a0 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
1e0b0 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
1e0c0 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
1e0d0 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
1e0e0 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
1e0f0 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1e100 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
1e110 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
1e120 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
1e130 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
1e140 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
1e150 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
1e160 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
1e170 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1e180 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
1e190 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1e1a0 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
1e1b0 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
1e1c0 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
1e1d0 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
1e1e0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1e1f0 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
1e200 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1e210 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1e220 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
1e230 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
1e240 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e260 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1e270 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
1e280 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1e290 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64  gs & SF_Compound
1e2a0 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c  )!=0 && pSub->pL
1e2b0 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75  imit ){.    retu
1e2c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2f0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e300 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
1e310 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
1e320 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e340 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e350 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
1e360 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1e370 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
1e380 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1e390 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e3a0 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66  ion (5)  */.  if
1e3b0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1e3c0 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
1e3d0 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
1e3e0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1e3f0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e400 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20  ons (8)(9) */.  
1e410 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
1e420 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1e430 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65  ct)!=0 && subque
1e440 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
1e450 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1e460 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e470 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69   (6)  */.  }.  i
1e480 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
1e490 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
1e4a0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1e4b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e4e0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
1e4f0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
1e500 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
1e510 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
1e520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e530 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e540 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (16) */.  if( pS
1e550 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
1e560 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
1e570 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e580 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e590 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (19) */.  if( pS
1e5a0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1e5b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1e5c0 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a  Distinct)!=0 ){.
1e5d0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1e5e0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1e5f0 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20  ction (21) */.  
1e600 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53  }.  testcase( pS
1e610 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1e620 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20  F_Recursive );. 
1e630 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d   testcase( pSub-
1e640 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
1e650 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69 66  inMaxAgg );.  if
1e660 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1e670 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65   & (SF_Recursive
1e680 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29  |SF_MinMaxAgg) )
1e690 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1e6a0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
1e6b0 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a 2f  (22) and (24) */
1e6c0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1e6d0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
1e6e0 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62 2d  ursive) && pSub-
1e6f0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
1e700 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74  eturn 0; /* Rest
1e710 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a  riction (23) */.
1e720 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45    }..  /* OBSOLE
1e730 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20  TE COMMENT 1:.  
1e740 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  ** Restriction 3
1e750 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1e760 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
1e770 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1e780 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
1e790 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
1e7a0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1e7b0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
1e7c0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
1e7d0 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
1e7e0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1e7f0 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1e800 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
1e810 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
1e820 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
1e830 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
1e840 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
1e850 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
1e860 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1e870 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
1e880 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
1e890 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
1e8a0 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
1e8b0 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    ** OBSOLETE CO
1e8c0 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65  MMENT 2:.  ** Re
1e8d0 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
1e8e0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1e8f0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1e900 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
1e910 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
1e920 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1e930 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
1e940 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
1e950 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
1e960 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
1e970 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1e980 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1e990 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
1e9a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
1e9b0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
1e9c0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
1e9d0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
1e9e0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
1e9f0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
1ea00 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1ea10 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
1ea20 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
1ea30 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
1ea40 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
1ea50 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
1ea60 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
1ea70 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
1ea80 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
1ea90 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
1eaa0 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a  NNER JOIN..  **.
1eab0 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49    ** THIS OVERRI
1eac0 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d  DES OBSOLETE COM
1ead0 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42  MENTS 1 AND 2 AB
1eae0 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74  OVE:.  ** Ticket
1eaf0 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61   #3300 shows tha
1eb00 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  t flattening the
1eb10 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
1eb20 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
1eb30 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20  is fraught with 
1eb40 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f  danger.  Best to
1eb50 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65   avoid the whole
1eb60 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a   thing.  If the.
1eb70 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
1eb80 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1eb90 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
1eba0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74  then do not flat
1ebb0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ten..  */.  if( 
1ebc0 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f  (pSubitem->fg.jo
1ebd0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1ebe0 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
1ebf0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
1ec00 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
1ec10 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1ec20 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1ec30 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
1ec40 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
1ec50 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
1ec60 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
1ec70 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
1ec80 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
1ec90 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
1eca0 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
1ecb0 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
1ecc0 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
1ecd0 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
1ece0 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
1ecf0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
1ed00 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
1ed10 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1ed20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1ed30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
1ed40 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  n 20 */.    }.  
1ed50 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
1ed60 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1ed70 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
1ed80 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
1ed90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1eda0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1edb0 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
1edc0 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
1edd0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
1ede0 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1edf0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1ee00 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1ee10 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
1ee20 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
1ee30 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1ee40 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1ee50 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1ee60 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
1ee70 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
1ee80 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
1ee90 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1eea0 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73  ert( pSub->pELis
1eeb0 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d  t->nExpr==pSub1-
1eec0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
1eed0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  ;.      if( (pSu
1eee0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1eef0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1ef00 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20  ggregate))!=0.  
1ef10 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e       || (pSub1->
1ef20 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d  pPrior && pSub1-
1ef30 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20  >op!=TK_ALL) .  
1ef40 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70       || pSub1->p
1ef50 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20  Src->nSrc<1.    
1ef60 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
1ef70 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1ef80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ef90 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1efa0 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
1efb0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1efc0 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  18. */.    if( p
1efd0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1efe0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1eff0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1f000 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1f010 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
1f020 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1f030 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72  y->a[ii].u.x.iOr
1f040 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
1f050 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1f060 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
1f070 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
1f080 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
1f090 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1f0a0 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45  ted. *****/.  SE
1f0b0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
1f0c0 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25  se,p,("flatten %
1f0d0 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25  s.%p from term %
1f0e0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1f0f0 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a           pSub->z
1f100 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69  SelName, pSub, i
1f110 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75  From));..  /* Au
1f120 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71  thorize the subq
1f130 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65  uery */.  pParse
1f140 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1f150 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1f160 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d  ;.  TESTONLY(i =
1f170 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ) sqlite3AuthChe
1f180 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1f190 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
1f1a0 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  0);.  testcase( 
1f1b0 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29  i==SQLITE_DENY )
1f1c0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  ;.  pParse->zAut
1f1d0 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
1f1e0 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20  dAuthContext;.. 
1f1f0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71   /* If the sub-q
1f200 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1f210 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
1f220 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65  ent, then (by re
1f230 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  strictions.  ** 
1f240 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29  17 and 18 above)
1f250 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e   it must be a UN
1f260 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20  ION ALL and the 
1f270 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73  parent query mus
1f280 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68  t .  ** be of th
1f290 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
1f2a0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78  *     SELECT <ex
1f2b0 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c  pr-list> FROM (<
1f2c0 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65  sub-query>) <whe
1f2d0 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a  re-clause> .  **
1f2e0 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  .  ** followed b
1f2f0 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  y any ORDER BY, 
1f300 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46  LIMIT and/or OFF
1f310 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69  SET clauses. Thi
1f320 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65  s block.  ** cre
1f330 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20  ates N-1 copies 
1f340 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  of the parent qu
1f350 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ery without any 
1f360 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
1f370 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20  or .  ** OFFSET 
1f380 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e  clauses and join
1f390 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65  s them to the le
1f3a0 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ft-hand-side of 
1f3b0 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
1f3c0 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c  * using UNION AL
1f3d0 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20  L operators. In 
1f3e0 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74  this case N is t
1f3f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  he number of sim
1f400 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  ple.  ** select 
1f410 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
1f420 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  e compound sub-q
1f430 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
1f440 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
1f450 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
1f460 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20  1 FROM (.  **   
1f470 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52       SELECT x FR
1f480 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
1f490 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1f4a0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1f4b0 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  y FROM tab.  ** 
1f4c0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1f4d0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1f4e0 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f  ECT abs(z*2) FRO
1f4f0 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20  M tab2.  **     
1f500 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44  ) WHERE a!=5 ORD
1f510 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
1f520 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
1f530 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
1f540 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f    SELECT x+1 FRO
1f550 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21  M tab WHERE x+1!
1f560 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
1f570 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
1f580 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74  ELECT y+1 FROM t
1f590 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a  ab WHERE y+1!=5.
1f5a0 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
1f5b0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
1f5c0 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52  CT abs(z*2)+1 FR
1f5d0 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62  OM tab2 WHERE ab
1f5e0 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a  s(z*2)+1!=5.  **
1f5f0 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a       ORDER BY 1.
1f600 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c    **.  ** We cal
1f610 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70  l this the "comp
1f620 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1f630 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a  attening"..  */.
1f640 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d    for(pSub=pSub-
1f650 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70  >pPrior; pSub; p
1f660 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1f670 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
1f680 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  New;.    ExprLis
1f690 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
1f6a0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45  >pOrderBy;.    E
1f6b0 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
1f6c0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70  >pLimit;.    Exp
1f6d0 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r *pOffset = p->
1f6e0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c  pOffset;.    Sel
1f6f0 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
1f700 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
1f710 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1f720 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
1f730 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
1f740 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
1f750 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66  = 0;.    p->pOff
1f760 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  set = 0;.    pNe
1f770 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  w = sqlite3Selec
1f780 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a  tDup(db, p, 0);.
1f790 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1f7a0 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70  tSetName(pNew, p
1f7b0 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a  Sub->zSelName);.
1f7c0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
1f7d0 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d   pOffset;.    p-
1f7e0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1f7f0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1f800 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1f810 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
1f820 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
1f830 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e  _ALL;.    if( pN
1f840 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
1f850 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
1f860 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1f870 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
1f880 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
1f890 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
1f8a0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
1f8b0 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ew;.      pNew->
1f8c0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
1f8d0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
1f8e0 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  w;.      SELECTT
1f8f0 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c  RACE(2,pParse,p,
1f900 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70  .         ("comp
1f910 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1f920 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73 20  attener creates 
1f930 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22  %s.%p as peer\n"
1f940 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ,.         pNew-
1f950 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29  >zSelName, pNew)
1f960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f970 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1f980 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
1f990 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
1f9a0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
1f9b0 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
1f9c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
1f9d0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
1f9e0 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
1f9f0 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
1fa00 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1fa10 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
1fa20 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
1fa30 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
1fa40 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1fa50 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
1fa60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
1fa70 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1fa80 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
1fa90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1faa0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
1fab0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1fac0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1fad0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
1fae0 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
1faf0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1fb00 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
1fb10 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
1fb20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
1fb30 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
1fb40 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
1fb50 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
1fb60 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1fb70 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1fb80 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
1fb90 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
1fba0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
1fbb0 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
1fbc0 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
1fbd0 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
1fbe0 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
1fbf0 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
1fc00 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
1fc10 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
1fc20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
1fc30 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
1fc40 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
1fc50 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
1fc60 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
1fc70 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
1fc80 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
1fc90 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
1fca0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
1fcb0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
1fcc0 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
1fcd0 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b  oDel->nRef==1 ){
1fce0 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54  .      Parse *pT
1fcf0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1fd00 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1fd10 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54  Parse);.      pT
1fd20 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f  abToDel->pNextZo
1fd30 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c  mbie = pToplevel
1fd40 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
1fd50 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
1fd60 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62  ZombieTab = pTab
1fd70 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  ToDel;.    }else
1fd80 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  {.      pTabToDe
1fd90 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d  l->nRef--;.    }
1fda0 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
1fdb0 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Tab = 0;.  }..  
1fdc0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1fdd0 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
1fde0 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  for each term in
1fdf0 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1fe00 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65  uery.  ** flatte
1fe10 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62  ning (as describ
1fe20 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77  ed above).  If w
1fe30 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69  e are doing a di
1fe40 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a  fferent kind.  *
1fe50 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * of flattening 
1fe60 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f  - a flattening o
1fe70 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70  ther than a comp
1fe80 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1fe90 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20  attening -.  ** 
1fea0 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f  then this loop o
1feb0 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20  nly runs once.. 
1fec0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
1fed0 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20  op moves all of 
1fee0 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
1fef0 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
1ff00 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
1ff10 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ff20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1ff30 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
1ff40 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
1ff50 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
1ff60 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1ff70 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
1ff80 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
1ff90 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
1ffa0 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
1ffb0 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
1ffc0 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
1ffd0 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
1ffe0 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
1fff0 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
20000 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
20010 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
20020 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
20030 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
20040 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
20050 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
20060 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
20070 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
20080 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
20090 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65    */.  for(pPare
200a0 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70  nt=p; pParent; p
200b0 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e  Parent=pParent->
200c0 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75  pPrior, pSub=pSu
200d0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
200e0 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20  int nSubSrc;.   
200f0 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30   u8 jointype = 0
20100 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20  ;.    pSubSrc = 
20110 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20  pSub->pSrc;     
20120 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
20130 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  f subquery */.  
20140 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62    nSubSrc = pSub
20150 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e  Src->nSrc;  /* N
20160 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
20170 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20  n subquery FROM 
20180 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53  clause */.    pS
20190 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
201a0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
201b0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
201c0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ter query */..  
201d0 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
201e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
201f0 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69  ent==p );  /* Fi
20200 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68  rst time through
20210 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
20220 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53     jointype = pS
20230 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  ubitem->fg.joint
20240 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ype;.    }else{.
20250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20260 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20  arent!=p );  /* 
20270 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
20280 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68  nt times through
20290 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
202a0 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
202b0 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  t->pSrc = sqlite
202c0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
202d0 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
202e0 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29     if( pSrc==0 )
202f0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
20300 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
20310 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed );.        br
20320 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
20330 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   }..    /* The s
20340 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73  ubquery uses a s
20350 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68  ingle slot of th
20360 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
20370 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a   the outer.    *
20380 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  * query.  If the
20390 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f   subquery has mo
203a0 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d  re than one elem
203b0 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ent in its FROM 
203c0 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74  clause,.    ** t
203d0 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f  hen expand the o
203e0 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61  uter query to ma
203f0 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20  ke space for it 
20400 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d  to hold all elem
20410 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
20420 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
20430 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
20440 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
20450 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
20460 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54  OM tabA, (SELECT
20470 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75   * FROM sub1, su
20480 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a  b2), tabB;.    *
20490 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74  *.    ** The out
204a0 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73  er query has 3 s
204b0 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d  lots in its FROM
204c0 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c   clause.  One sl
204d0 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ot of the.    **
204e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68   outer query (th
204f0 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69  e middle slot) i
20500 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75  s used by the su
20510 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78  bquery.  The nex
20520 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f  t.    ** block o
20530 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61  f code will expa
20540 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
20550 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ry FROM clause t
20560 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  o 4 slots..    *
20570 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f  * The middle slo
20580 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f  t is expanded to
20590 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72   two slots in or
205a0 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  der to make spac
205b0 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  e.    ** for the
205c0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
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 73 75 62 71 75 65 72 79   of the subquery
205f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20600 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
20610 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
20620 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74  c = pSrc = sqlit
20630 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
20640 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53  (db, pSrc, nSubS
20650 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20  rc-1,iFrom+1);. 
20660 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
20670 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
20680 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20690 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
206a0 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46  * Transfer the F
206b0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
206c0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
206d0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  ry into the.    
206e0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  ** outer query..
206f0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
20700 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
20710 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
20720 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
20730 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72  b, pSrc->a[i+iFr
20740 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20  om].pUsing);.   
20750 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d     assert( pSrc-
20760 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69  >a[i+iFrom].fg.i
20770 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20  sTabFunc==0 );. 
20780 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
20790 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
207a0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
207b0 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
207c0 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
207d0 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
207e0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
207f0 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74  [iFrom].fg.joint
20800 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
20810 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
20820 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
20830 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
20840 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
20850 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
20860 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
20870 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
20880 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
20890 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
208a0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
208b0 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
208c0 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
208d0 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
208e0 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
208f0 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
20900 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
20910 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
20920 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
20930 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
20940 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
20950 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
20960 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
20970 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
20980 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20990 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
209a0 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
209b0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
209c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
209d0 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
209e0 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
209f0 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
20a00 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
20a10 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
20a20 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
20a30 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
20a40 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65     pList = pPare
20a50 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  nt->pEList;.    
20a60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
20a70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
20a80 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
20a90 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  a[i].zName==0 ){
20aa0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
20ab0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
20ac0 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  StrDup(db, pList
20ad0 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
20ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
20af0 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
20b00 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
20b10 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
20b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20b30 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
20b40 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f  derBy ){.      /
20b50 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
20b60 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f   any non-zero iO
20b70 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73  rderByCol values
20b80 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
20b90 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  he.      ** ORDE
20ba0 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72  R BY column expr
20bb0 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69  ession is identi
20bc0 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65  cal to the iOrde
20bd0 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20  rByCol'th.      
20be0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  ** expression re
20bf0 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
20c00 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e   statement pSub.
20c10 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c   Since these val
20c20 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20  ues.      ** do 
20c30 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
20c40 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f  correspond to co
20c50 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20  lumns in SELECT 
20c60 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e  statement pParen
20c70 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  t,.      ** zero
20c80 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61   them before tra
20c90 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44  nsfering the ORD
20ca0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
20cb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
20cc0 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d  Not doing this m
20cd0 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f  ay cause an erro
20ce0 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  r if a subsequen
20cf0 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  t call to this. 
20d00 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
20d10 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
20d20 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  tten a compound 
20d30 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70  sub-query into p
20d40 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  Parent.      ** 
20d50 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68  (the only way th
20d60 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73  is can happen is
20d70 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   if the compound
20d80 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20   sub-query is.  
20d90 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79      ** currently
20da0 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70   part of pSub->p
20db0 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74  Src). See ticket
20dc0 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20   [d11a6e908f].  
20dd0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
20de0 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
20df0 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
20e00 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20e10 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
20e20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  i++){.        pO
20e30 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
20e40 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30  .iOrderByCol = 0
20e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20e60 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
20e70 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
20e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
20e90 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b  ub->pPrior==0 );
20ea0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20eb0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
20ec0 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
20ed0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
20ee0 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20     }.    pWhere 
20ef0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
20f00 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
20f10 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73  e, 0);.    if( s
20f20 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
20f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20f40 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d  arent->pHaving==
20f50 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
20f60 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50  nt->pHaving = pP
20f70 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20  arent->pWhere;. 
20f80 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
20f90 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
20fa0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
20fb0 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
20fc0 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
20fd0 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20  nt->pHaving, .  
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21000 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
21010 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  b, pSub->pHaving
21020 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73  , 0));.      ass
21030 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47  ert( pParent->pG
21040 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
21050 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f     pParent->pGro
21060 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
21070 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53  prListDup(db, pS
21080 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29  ub->pGroupBy, 0)
21090 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
210a0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
210b0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
210c0 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
210d0 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
210e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73  ;.    }.    subs
210f0 74 53 65 6c 65 63 74 28 64 62 2c 20 70 50 61 72  tSelect(db, pPar
21100 65 6e 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ent, iParent, pS
21110 75 62 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a  ub->pEList, 0);.
21120 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
21130 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
21140 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
21150 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
21160 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
21170 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
21180 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
21190 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
211a0 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
211b0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
211c0 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
211d0 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
211e0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
211f0 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
21200 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
21210 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
21220 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
21230 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
21240 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
21250 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
21260 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
21270 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
21280 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
21290 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
212a0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
212b0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
212c0 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
212d0 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
212e0 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
212f0 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
21300 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
21310 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
21320 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
21330 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
21340 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
21350 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
21360 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
21370 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43  ub1);..#if SELEC
21380 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
21390 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
213a0 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
213b0 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
213c0 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
213d0 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  p,("After flatte
213e0 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ning:\n"));.    
213f0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
21400 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
21410 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
21420 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
21430 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
21440 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
21450 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
21460 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
21470 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
21480 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21490 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
214a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
214b0 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61  T_VIEW)./*.** Ma
214c0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c  ke copies of rel
214d0 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75  evant WHERE clau
214e0 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  se terms of the 
214f0 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f  outer query into
21500 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
21510 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
21520 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
21530 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
21540 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20  OM (SELECT a AS 
21550 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d  x, c-d AS y FROM
21560 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41   t1) WHERE x=5 A
21570 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
21580 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
21590 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
215a0 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
215b0 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79  a AS x, c-d AS y
215c0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
215d0 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a  =5 AND c-d=10).*
215e0 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20  *     WHERE x=5 
215f0 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
21600 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74  The hope is that
21610 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64   the terms added
21620 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75   to the inner qu
21630 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74  ery will make it
21640 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65   more.** efficie
21650 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  nt..**.** Do not
21660 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70   attempt this op
21670 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a  timization if:.*
21680 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 20 69  *.**   (1) The i
21690 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 61 6e  nner query is an
216a0 20 61 67 67 72 65 67 61 74 65 2e 20 20 28 49 6e   aggregate.  (In
216b0 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 27 64   that case, we'd
216c0 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20   really want.** 
216d0 20 20 20 20 20 20 74 6f 20 63 6f 70 79 20 74 68        to copy th
216e0 65 20 6f 75 74 65 72 20 57 48 45 52 45 2d 63 6c  e outer WHERE-cl
216f0 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20  ause terms onto 
21700 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
21710 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  e of the.**     
21720 20 20 69 6e 6e 65 72 20 71 75 65 72 79 2e 20 20    inner query.  
21730 42 75 74 20 74 68 65 79 20 70 72 6f 62 61 62 6c  But they probabl
21740 79 20 77 6f 6e 27 74 20 68 65 6c 70 20 74 68 65  y won't help the
21750 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74  re so do not bot
21760 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32  her.).**.**   (2
21770 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
21780 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73 69  y is the recursi
21790 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ve part of a com
217a0 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73  mon table expres
217b0 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  sion..**.**   (3
217c0 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
217d0 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c  y has a LIMIT cl
217e0 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65 20  ause (since the 
217f0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57  changes to the W
21800 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c  HERE.**       cl
21810 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65  ose would change
21820 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   the meaning of 
21830 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a  the LIMIT)..**.*
21840 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65  *   (4) The inne
21850 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
21860 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
21870 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54  a LEFT JOIN.  (T
21880 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20  he caller.**    
21890 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73     enforces this
218a0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69 6e   restriction sin
218b0 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
218c0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65 6e  does not have en
218d0 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ough.**       in
218e0 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f  formation to kno
218f0 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  w.).**.**   (5) 
21900 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
21910 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
21920 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e  inates in the ON
21930 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
21940 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c  .**       of a L
21950 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20  EFT JOIN..**.** 
21960 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63  Return 0 if no c
21970 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
21980 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  and non-zero if 
21990 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52  one or more WHER
219a0 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d  E clause.** term
219b0 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 64  s are duplicated
219c0 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65   into the subque
219d0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
219e0 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  t pushDownWhereT
219f0 65 72 6d 73 28 0a 20 20 73 71 6c 69 74 65 33 20  erms(.  sqlite3 
21a00 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *db,          /*
21a10 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
21a20 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d 61  nnection (for ma
21a30 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20 20 53 65 6c  lloc()) */.  Sel
21a40 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20  ect *pSubq,     
21a50 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
21a60 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63  ry whose WHERE c
21a70 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61  lause is to be a
21a80 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78  ugmented */.  Ex
21a90 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
21aa0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
21ab0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
21ac0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
21ad0 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20 20  int iCursor     
21ae0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
21af0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75  number of the su
21b00 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45  bquery */.){.  E
21b10 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
21b20 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 53 65   nChng = 0;.  Se
21b30 6c 65 63 74 20 2a 70 58 3b 20 20 20 20 20 20 20  lect *pX;       
21b40 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
21b50 6e 67 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64  ng over compound
21b60 20 53 45 4c 45 43 54 73 20 69 6e 20 70 53 75 62   SELECTs in pSub
21b70 71 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72  q */.  if( pWher
21b80 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
21b90 0a 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b  .  for(pX=pSubq;
21ba0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69   pX; pX=pX->pPri
21bb0 6f 72 29 7b 0a 20 20 20 20 69 66 28 20 28 70 58  or){.    if( (pX
21bc0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
21bd0 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52 65  _Aggregate|SF_Re
21be0 63 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b 0a  cursive))!=0 ){.
21bf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21c00 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  pX->selFlags & S
21c10 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
21c20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21c30 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  X->selFlags & SF
21c40 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20  _Recursive );.  
21c50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
21c60 21 3d 70 53 75 62 71 20 29 3b 0a 20 20 20 20 20  !=pSubq );.     
21c70 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
21c80 73 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20 61  strictions (1) a
21c90 6e 64 20 28 32 29 20 2a 2f 0a 20 20 20 20 7d 0a  nd (2) */.    }.
21ca0 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d    }.  if( pSubq-
21cb0 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20  >pLimit!=0 ){.  
21cc0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
21cd0 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a  estriction (3) *
21ce0 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  /.  }.  while( p
21cf0 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  Where->op==TK_AN
21d00 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b  D ){.    nChng +
21d10 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  = pushDownWhereT
21d20 65 72 6d 73 28 64 62 2c 20 70 53 75 62 71 2c 20  erms(db, pSubq, 
21d30 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20  pWhere->pRight, 
21d40 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57  iCursor);.    pW
21d50 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70  here = pWhere->p
21d60 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Left;.  }.  if( 
21d70 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
21d80 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f  pWhere,EP_FromJo
21d90 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  in) ) return 0; 
21da0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 35  /* restriction 5
21db0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
21dc0 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
21dd0 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75  tant(pWhere, iCu
21de0 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68  rsor) ){.    nCh
21df0 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28  ng++;.    while(
21e00 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20   pSubq ){.      
21e10 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
21e20 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65  prDup(db, pWhere
21e30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
21e40 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
21e50 20 70 4e 65 77 2c 20 69 43 75 72 73 6f 72 2c 20   pNew, iCursor, 
21e60 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 29 3b 0a  pSubq->pEList);.
21e70 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68        pSubq->pWh
21e80 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
21e90 72 41 6e 64 28 64 62 2c 20 70 53 75 62 71 2d 3e  rAnd(db, pSubq->
21ea0 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
21eb0 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75       pSubq = pSu
21ec0 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  bq->pPrior;.    
21ed0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
21ee0 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Chng;.}.#endif /
21ef0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
21f00 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
21f10 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
21f20 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
21f30 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f  /../*.** Based o
21f40 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
21f50 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  f the AggInfo st
21f60 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
21f70 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a  d by the first.*
21f80 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73  * argument, this
21f90 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
21fa0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
21fb0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
21fc0 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79  *    * the query
21fd0 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61   contains just a
21fe0 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74   single aggregat
21ff0 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20  e function,.**  
22000 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74    * the aggregat
22010 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69  e function is ei
22020 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61  ther min() or ma
22030 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a  x(), and.**    *
22040 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
22050 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
22060 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c  unction is a col
22070 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  umn value..**.**
22080 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
22090 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74  bove are true, t
220a0 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  hen WHERE_ORDERB
220b0 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
220c0 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73  RDERBY_MAX.** is
220d0 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70   returned as app
220e0 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20  ropriate. Also, 
220f0 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
22100 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
22110 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67   .** list of arg
22120 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
22130 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62   the aggregate b
22140 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
22150 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
22160 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  e conditions abo
22170 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20  ve are not met, 
22180 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
22190 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45   to 0 and.** WHE
221a0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
221b0 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
221c0 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d  /.static u8 minM
221d0 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20  axQuery(AggInfo 
221e0 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c  *pAggInfo, ExprL
221f0 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b  ist **ppMinMax){
22200 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48  .  int eRet = WH
22210 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
22220 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  AL;          /* 
22230 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
22240 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30  .  *ppMinMax = 0
22250 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
22260 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20  ->nFunc==1 ){.  
22270 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
22280 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
22290 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67  0].pExpr; /* Agg
222a0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
222b0 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
222c0 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d  *pEList = pExpr-
222d0 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f  >x.pList;      /
222e0 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  * Arguments to a
222f0 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  gg function */..
22300 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
22310 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
22320 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  NCTION );.    if
22330 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
22340 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20  st->nExpr==1 && 
22350 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
22360 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
22370 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63  OLUMN ){.      c
22380 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
22390 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
223a0 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  en;.      if( sq
223b0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
223c0 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
223d0 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
223e0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
223f0 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  N;.        *ppMi
22400 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
22410 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
22420 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
22430 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29  unc, "max")==0 )
22440 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
22450 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
22460 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  AX;.        *ppM
22470 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
22480 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22490 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  }..  assert( *pp
224a0 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70  MinMax==0 || (*p
224b0 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d  pMinMax)->nExpr=
224c0 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
224d0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
224e0 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
224f0 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
22500 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
22510 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
22520 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
22530 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
22540 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
22550 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
22560 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
22570 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
22580 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
22590 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
225a0 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
225b0 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
225c0 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
225d0 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
225e0 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
225f0 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
22600 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
22610 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
22620 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
22630 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
22640 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
22650 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
22660 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
22670 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
22680 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
22690 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
226a0 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
226b0 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
226c0 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
226d0 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
226e0 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
226f0 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
22700 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
22710 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
22720 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
22730 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
22740 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
22750 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
22760 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
22770 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
22780 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
22790 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
227a0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
227b0 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
227c0 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
227d0 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
227e0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
227f0 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
22800 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
22810 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
22820 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
22830 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f  ( NEVER(pAggInfo
22840 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65  ->nFunc==0) ) re
22850 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
22860 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
22870 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ].pFunc->funcFla
22880 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
22890 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
228a0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
228b0 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
228c0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
228d0 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
228e0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
228f0 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
22900 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
22910 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
22920 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
22930 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
22940 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
22950 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
22960 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
22970 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
22980 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
22990 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
229a0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
229b0 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
229c0 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
229d0 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
229e0 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
229f0 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
22a00 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
22a10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
22a20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
22a30 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
22a40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
22a50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22a60 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
22a70 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
22a80 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  From->fg.isIndex
22a90 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c  edBy ){.    Tabl
22aa0 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
22ab0 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
22ac0 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46  *zIndexedBy = pF
22ad0 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  rom->u1.zIndexed
22ae0 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  By;.    Index *p
22af0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
22b00 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
22b10 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
22b20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
22b30 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
22b40 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20  dexedBy); .     
22b50 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
22b60 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
22b70 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
22b80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
22b90 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
22ba0 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
22bb0 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20  IndexedBy, 0);. 
22bc0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
22bd0 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
22be0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22bf0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
22c00 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64     pFrom->pIBInd
22c10 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
22c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22c30 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
22c40 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
22c50 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
22c60 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
22c70 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
22c80 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
22c90 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
22ca0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
22cb0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
22cc0 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
22cd0 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
22ce0 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
22cf0 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
22d00 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
22d10 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
22d20 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
22d30 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
22d40 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
22d50 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
22d60 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
22d70 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
22d80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
22d90 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
22da0 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
22db0 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
22dc0 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
22dd0 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
22de0 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
22df0 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
22e00 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
22e10 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
22e20 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
22e30 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
22e40 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
22e50 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
22e60 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
22e70 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
22e80 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
22e90 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
22ea0 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
22eb0 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
22ec0 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
22ed0 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
22ee0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
22ef0 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
22f00 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
22f10 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
22f20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
22f30 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
22f40 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
22f50 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
22f60 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
22f70 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
22f80 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
22f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22fa0 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
22fb0 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
22fc0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
22fd0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
22fe0 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
22ff0 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
23000 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
23010 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
23020 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
23030 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
23040 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
23050 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
23060 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  ;..  if( p->pPri
23070 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  or==0 ) return W
23080 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  RC_Continue;.  i
23090 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
230a0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
230b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70  ontinue;.  for(p
230c0 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e  X=p; pX && (pX->
230d0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58  op==TK_ALL || pX
230e0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  ->op==TK_SELECT)
230f0 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
23100 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29  {}.  if( pX==0 )
23110 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
23120 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70  inue;.  a = p->p
23130 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f  OrderBy->a;.  fo
23140 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d  r(i=p->pOrderBy-
23150 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nExpr-1; i>=0; 
23160 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  i--){.    if( a[
23170 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  i].pExpr->flags 
23180 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62  & EP_Collate ) b
23190 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
231a0 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  i<0 ) return WRC
231b0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a  _Continue;..  /*
231c0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
231d0 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
231e0 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72  ans the transfor
231f0 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  mation is requir
23200 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ed. */..  pParse
23210 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
23220 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
23230 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
23240 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
23250 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
23260 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
23270 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
23280 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d  WRC_Abort;.  mem
23290 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73  set(&dummy, 0, s
232a0 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20  izeof(dummy));. 
232b0 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74   pNewSrc = sqlit
232c0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
232d0 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
232e0 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77  ,0,0,&dummy,pNew
232f0 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65  ,0,0);.  if( pNe
23300 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  wSrc==0 ) return
23310 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70   WRC_Abort;.  *p
23320 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70  New = *p;.  p->p
23330 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20  Src = pNewSrc;. 
23340 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c   p->pEList = sql
23350 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
23360 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
23370 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
23380 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a  _ASTERISK, 0));.
23390 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c    p->op = TK_SEL
233a0 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  ECT;.  p->pWhere
233b0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47   = 0;.  pNew->pG
233c0 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e  roupBy = 0;.  pN
233d0 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b  ew->pHaving = 0;
233e0 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
233f0 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69  y = 0;.  p->pPri
23400 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65  or = 0;.  p->pNe
23410 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69  xt = 0;.  p->pWi
23420 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c  th = 0;.  p->sel
23430 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
23440 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28  pound;.  assert(
23450 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
23460 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30  SF_Converted)==0
23470 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
23480 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65  s |= SF_Converte
23490 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
234a0 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
234b0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
234c0 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
234d0 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
234e0 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
234f0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
23500 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
23510 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
23520 73 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20  see if the FROM 
23530 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f  clause term pFro
23540 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75  m has table-valu
23550 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  ed function.** a
23560 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74  rguments.  If it
23570 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20   does, leave an 
23580 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
23590 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
235a0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
235b0 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e  since pFrom is n
235c0 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
235d0 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20   a table-valued 
235e0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
235f0 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65  tic int cannotBe
23600 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
23610 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
23620 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
23630 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
23640 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
23650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
23660 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27  orMsg(pParse, "'
23670 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e  %s' is not a fun
23680 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a  ction", pFrom->z
23690 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
236a0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
236b0 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
236c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
236d0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
236e0 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
236f0 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
23700 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
23710 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
23720 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
23730 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
23740 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
23750 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
23760 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
23770 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
23780 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
23790 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
237a0 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
237b0 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
237c0 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
237d0 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
237e0 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
237f0 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
23800 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
23810 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
23820 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
23830 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
23840 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
23850 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
23860 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
23870 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
23880 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
23890 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
238a0 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
238c0 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d  * Current innerm
238d0 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
238e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
238f0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
23900 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
23910 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
23920 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
23930 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
23940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23950 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
23960 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
23970 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
23980 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
23990 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
239a0 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
239b0 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
239c0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
239d0 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
239e0 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
239f0 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
23a00 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
23a10 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
23a20 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
23a30 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
23a40 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
23a50 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
23a60 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
23a70 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
23a80 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
23a90 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
23aa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23ab0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23ac0 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
23ad0 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
23ae0 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
23af0 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
23b00 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
23b10 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
23b20 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
23b30 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
23b40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23b50 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
23b60 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
23b70 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
23b80 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
23b90 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
23ba0 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
23bb0 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
23bc0 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
23bd0 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
23be0 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
23bf0 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
23c00 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
23c10 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
23c20 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
23c30 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
23c40 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
23c50 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
23c60 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
23c70 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
23c80 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
23c90 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
23ca0 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
23cb0 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
23cc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23cd0 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
23ce0 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
23cf0 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
23d00 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
23d10 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70  =0 || (pParse->p
23d20 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73  With==0 && pPars
23d30 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d  e->pWithToFree==
23d40 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  0) );.  if( pWit
23d50 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
23d60 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d   pParse->pWith!=
23d70 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69  pWith );.    pWi
23d80 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
23d90 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
23da0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
23db0 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
23dc0 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70  Free ) pParse->p
23dd0 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69  WithToFree = pWi
23de0 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  th;.  }.}../*.**
23df0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
23e00 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e  hecks if argumen
23e10 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74  t pFrom refers t
23e20 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64  o a CTE declared
23e30 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63   by .** a WITH c
23e40 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61  lause on the sta
23e50 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69  ck currently mai
23e60 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70  ntained by the p
23e70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69  arser. And,.** i
23e80 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  f currently proc
23e90 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70  essing a CTE exp
23ea0 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69  ression, if it i
23eb0 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  s a recursive.**
23ec0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
23ed0 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a  e current CTE..*
23ee0 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61  *.** If pFrom fa
23ef0 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20  lls into either 
23f00 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67  of the two categ
23f10 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72  ories above, pFr
23f20 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20  om->pTab.** and 
23f30 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
23f40 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72   populated accor
23f50 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c  dingly. The call
23f60 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a  er should check.
23f70 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21  ** (pFrom->pTab!
23f80 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  =0) to determine
23f90 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
23fa0 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74  a successful mat
23fb0 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e  ch.** was found.
23fc0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
23fd0 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73  r not a match is
23fe0 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f   found, SQLITE_O
23ff0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
24000 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   no error.** occ
24010 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
24020 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20   does occur, an 
24030 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
24040 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
24050 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d  * parser and som
24060 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
24070 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
24080 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
24090 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78  tatic int withEx
240a0 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a  pand(.  Walker *
240b0 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75  pWalker, .  stru
240c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
240d0 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73  *pFrom.){.  Pars
240e0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
240f0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  ker->pParse;.  s
24100 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
24110 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63  rse->db;.  struc
24120 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20  t Cte *pCte;    
24130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
24140 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55  tched CTE (or NU
24150 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20  LL if no match) 
24160 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
24170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24180 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61       /* WITH cla
24190 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65  use that pCte be
241a0 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
241b0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
241c0 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65  ab==0 );..  pCte
241d0 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50   = searchWith(pP
241e0 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72  arse->pWith, pFr
241f0 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69  om, &pWith);.  i
24200 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54  f( pCte ){.    T
24210 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
24220 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
24230 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
24240 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  el;.    Select *
24250 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
24260 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f        /* Left-mo
24270 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
24280 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ent */.    int b
24290 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20  MayRecursive;   
242a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
242b0 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69   if compound joi
242c0 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c  ned by UNION [AL
242d0 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a  L] */.    With *
242e0 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20  pSavedWith;     
242f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
24300 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72  al value of pPar
24310 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20  se->pWith */..  
24320 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43    /* If pCte->zC
24330 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  teErr is non-NUL
24340 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
24350 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
24360 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
24370 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
24380 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
24390 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
243a0 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
243b0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
243c0 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  y. If pCte->zCte
243d0 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Err is NULL, the
243e0 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  n this is not a 
243f0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
24400 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  nce..    ** In t
24410 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65  his case, procee
24420 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
24430 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a  Cte->zCteErr ){.
24440 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
24450 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43  orMsg(pParse, pC
24460 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74  te->zCteErr, pCt
24470 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e->zName);.     
24480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
24490 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
244a0 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  if( cannotBeFunc
244b0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72  tion(pParse, pFr
244c0 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  om) ) return SQL
244d0 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  ITE_ERROR;..    
244e0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
244f0 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
24500 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
24510 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
24520 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
24530 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
24540 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
24550 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
24560 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
24570 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  1;.    pTab->zNa
24580 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
24590 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a  rDup(db, pCte->z
245a0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d  Name);.    pTab-
245b0 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
245c0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
245d0 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
245e0 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
245f0 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
24600 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
24610 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
24620 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c  al | TF_NoVisibl
24630 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f  eRowid;.    pFro
24640 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
24650 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
24660 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c  , pCte->pSelect,
24670 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
24680 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
24690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
246a0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  MEM_BKPT;.    as
246b0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
246c0 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  lect );..    /* 
246d0 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
246e0 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
246f0 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20  . */.    pSel = 
24700 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
24710 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76      bMayRecursiv
24720 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d  e = ( pSel->op==
24730 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e  TK_ALL || pSel->
24740 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
24750 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
24760 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
24770 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c  nt i;.      SrcL
24780 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f  ist *pSrc = pFro
24790 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
247a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
247b0 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
247c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
247d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
247e0 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
247f0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  >a[i];.        i
24800 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
24810 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ase==0 .        
24820 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
24830 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
24840 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
24850 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
24860 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20   pCte->zName).  
24870 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
24880 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
24890 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
248a0 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52     pItem->fg.isR
248b0 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
248c0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
248d0 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
248e0 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSel->selFlags |
248f0 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a  = SF_Recursive;.
24900 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24910 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
24920 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69  Only one recursi
24930 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ve reference is 
24940 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20  permitted. */ . 
24950 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65     if( pTab->nRe
24960 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  f>2 ){.      sql
24970 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20  ite3ErrorMsg(.  
24980 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
24990 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65  "multiple refere
249a0 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76  nces to recursiv
249b0 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43  e table: %s", pC
249c0 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  te->zName.      
249d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
249e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
249f0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
24a00 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c  pTab->nRef==1 ||
24a10 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67   ((pSel->selFlag
24a20 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  s&SF_Recursive) 
24a30 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32  && pTab->nRef==2
24a40 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
24a50 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75  zCteErr = "circu
24a60 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25  lar reference: %
24a70 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69  s";.    pSavedWi
24a80 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  th = pParse->pWi
24a90 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
24aa0 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
24ab0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
24ac0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d  lect(pWalker, bM
24ad0 61 79 52 65 63 75 72 73 69 76 65 20 3f 20 70 53  ayRecursive ? pS
24ae0 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53 65  el->pPrior : pSe
24af0 6c 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  l);.    pParse->
24b00 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a  pWith = pWith;..
24b10 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53      for(pLeft=pS
24b20 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f  el; pLeft->pPrio
24b30 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e  r; pLeft=pLeft->
24b40 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c  pPrior);.    pEL
24b50 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c  ist = pLeft->pEL
24b60 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ist;.    if( pCt
24b70 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20  e->pCols ){.    
24b80 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
24b90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
24ba0 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
24bb0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
24bc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
24bd0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
24be0 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72  as %d values for
24bf0 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20   %d columns",.  
24c00 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e            pCte->
24c10 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e  zName, pEList->n
24c20 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c  Expr, pCte->pCol
24c30 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20  s->nExpr.       
24c40 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
24c50 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76  se->pWith = pSav
24c60 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20  edWith;.        
24c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24c80 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
24c90 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65     pEList = pCte
24ca0 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a  ->pCols;.    }..
24cb0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
24cc0 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
24cd0 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26  Parse, pEList, &
24ce0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
24cf0 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b->aCol);.    if
24d00 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
24d10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  ){.      if( pSe
24d20 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  l->selFlags & SF
24d30 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
24d40 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65        pCte->zCte
24d50 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20  Err = "multiple 
24d60 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
24d70 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20  nces: %s";.     
24d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24d90 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
24da0 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72  "recursive refer
24db0 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65  ence in a subque
24dc0 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  ry: %s";.      }
24dd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
24de0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
24df0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pSel);.    }. 
24e00 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
24e10 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65   = 0;.    pParse
24e20 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64  ->pWith = pSaved
24e30 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  With;.  }..  ret
24e40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24e50 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
24e60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
24e70 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45  ./*.** If the SE
24e80 4c 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74  LECT passed as t
24e90 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
24ea0 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69  nt has an associ
24eb0 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c  ated WITH .** cl
24ec0 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f  ause, pop it fro
24ed0 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72  m the stack stor
24ee0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
24ef0 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a  e Parse object..
24f00 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
24f10 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74  ion is used as t
24f20 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  he xSelectCallba
24f30 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62  ck2() callback b
24f40 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  y.** sqlite3Sele
24f50 63 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20  ctExpand() when 
24f60 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54  walking a SELECT
24f70 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65   tree to resolve
24f80 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
24f90 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63  and other FROM c
24fa0 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20  lause elements. 
24fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24fc0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61  selectPopWith(Wa
24fd0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
24fe0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
24ff0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
25000 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
25010 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69  With *pWith = fi
25020 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
25030 70 57 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69  pWith;.  if( pWi
25040 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  th!=0 ){.    ass
25050 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
25060 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th==pWith );.   
25070 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
25080 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a   pWith->pOuter;.
25090 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
250a0 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74  ine selectPopWit
250b0 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  h 0.#endif../*.*
250c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
250d0 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  s a Walker callb
250e0 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69  ack for "expandi
250f0 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ng" a SELECT sta
25100 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61  tement..** "Expa
25110 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20  nding" means to 
25120 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  do the following
25130 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
25140 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
25150 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
25160 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
25170 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
25180 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
25190 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
251a0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
251b0 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
251c0 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
251d0 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
251e0 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
251f0 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
25200 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
25210 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
25220 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
25230 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
25240 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
25250 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
25260 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
25270 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
25280 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
25290 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
252a0 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
252b0 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
252c0 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
252d0 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
252e0 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
252f0 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
25300 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
25310 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
25320 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
25330 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
25340 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72   persistent repr
25350 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
25360 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
25370 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
25380 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
25390 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
253a0 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68  o accommodate th
253b0 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
253c0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
253d0 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
253e0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
253f0 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
25400 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
25410 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
25420 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
25430 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
25440 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
25450 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
25460 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
25470 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
25480 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
25490 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
254a0 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
254b0 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
254c0 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
254d0 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
254e0 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
254f0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
25500 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
25510 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
25520 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
25530 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
25540 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
25550 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
25560 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
25570 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
25580 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
25590 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
255a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
255b0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
255c0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
255d0 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
255e0 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70  *pE, *pRight, *p
255f0 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46  Expr;.  u16 selF
25600 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
25610 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  gs;..  p->selFla
25620 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
25630 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  d;.  if( db->mal
25640 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
25650 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
25660 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45  rt;.  }.  if( NE
25670 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20  VER(p->pSrc==0) 
25680 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53  || (selFlags & S
25690 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
256a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
256b0 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54  _Prune;.  }.  pT
256c0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
256d0 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
256e0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 57  pEList;.  if( pW
256f0 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61  alker->xSelectCa
25700 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c 65 63 74 50  llback2==selectP
25710 6f 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71  opWith ){.    sq
25720 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50  lite3WithPush(pP
25730 61 72 73 65 2c 20 66 69 6e 64 52 69 67 68 74 6d  arse, findRightm
25740 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 2c 20 30  ost(p)->pWith, 0
25750 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  );.  }..  /* Mak
25760 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
25770 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
25780 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
25790 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
257a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
257b0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
257c0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
257d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
257e0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
257f0 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
25800 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
25810 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
25820 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
25830 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
25840 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
25850 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
25860 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
25870 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
25880 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
25890 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
258a0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
258b0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
258c0 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
258d0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
258e0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
258f0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
25900 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
25910 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
25920 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
25930 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66  assert( pFrom->f
25940 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  g.isRecursive==0
25950 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21   || pFrom->pTab!
25960 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46  =0 );.    if( pF
25970 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
25980 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
25990 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
259a0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69  m->pTab==0 );.#i
259b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
259c0 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
259d0 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
259e0 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
259f0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25a00 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
25a10 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
25a20 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
25a30 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
25a40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25a50 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
25a60 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
25a70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
25a80 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
25a90 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
25aa0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
25ab0 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
25ac0 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
25ad0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
25ae0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
25af0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25b00 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
25b10 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75  er, pSel) ) retu
25b20 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25b30 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
25b40 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
25b50 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
25b60 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
25b70 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
25b80 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
25b90 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
25ba0 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
25bb0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
25bc0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
25bd0 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25  db, "sqlite_sq_%
25be0 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29  p", (void*)pTab)
25bf0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
25c00 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
25c10 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
25c20 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  or; }.      sqli
25c30 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
25c40 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
25c50 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61  Sel->pEList,&pTa
25c60 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61  b->nCol,&pTab->a
25c70 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
25c80 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
25c90 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
25ca0 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
25cb0 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
25cc0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
25cd0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  );.      pTab->t
25ce0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
25cf0 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
25d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25d10 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
25d20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
25d30 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
25d40 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
25d50 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
25d60 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
25d70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
25d80 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
25d90 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
25da0 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
25db0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
25dc0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
25dd0 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
25de0 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66  ab->nRef==0xffff
25df0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25e00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
25e10 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65  se, "too many re
25e20 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73  ferences to \"%s
25e30 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a  \": max 65535",.
25e40 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
25e50 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
25e60 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30   pFrom->pTab = 0
25e70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
25e80 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25e90 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
25ea0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nRef++;.      if
25eb0 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  ( !IsVirtual(pTa
25ec0 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46 75  b) && cannotBeFu
25ed0 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  nction(pParse, p
25ee0 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  From) ){.       
25ef0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25f00 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  t;.      }.#if !
25f10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25f20 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
25f30 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
25f40 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
25f50 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72  .      if( IsVir
25f60 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70 54  tual(pTab) || pT
25f70 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
25f80 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b         i16 nCol;
25f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
25fa0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
25fb0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
25fc0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
25fd0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
25fe0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
25ff0 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
26000 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
26010 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
26020 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
26030 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
26040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
26050 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72 6f  lectSetName(pFro
26060 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61 62  m->pSelect, pTab
26070 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
26080 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    nCol = pTab->n
26090 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61  Col;.        pTa
260a0 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  b->nCol = -1;.  
260b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
260c0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
260d0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
260e0 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ;.        pTab->
260f0 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20  nCol = nCol;.   
26100 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
26110 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65  }..    /* Locate
26120 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64   the index named
26130 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20   by the INDEXED 
26140 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e  BY clause, if an
26150 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  y. */.    if( sq
26160 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
26170 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72  okup(pParse, pFr
26180 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  om) ){.      ret
26190 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
261a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
261b0 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
261c0 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
261d0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
261e0 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
261f0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
26200 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74  cFailed || sqlit
26210 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
26220 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
26230 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26240 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  .  }..  /* For e
26250 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
26260 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
26270 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
26280 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
26290 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
262a0 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
262b0 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
262c0 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
262d0 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
262e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
262f0 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
26300 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
26310 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
26320 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53  * with the TK_AS
26330 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20  TERISK operator 
26340 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
26350 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
26360 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69  e column.  ** li
26370 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  st.  The followi
26380 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
26390 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
263a0 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20  K_ASTERISK.  ** 
263b0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
263c0 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20  expand each one 
263d0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
263e0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20  ll columns in.  
263f0 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  ** all tables.. 
26400 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
26410 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
26420 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
26430 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
26440 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
26450 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
26460 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
26470 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
26480 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70  xpr; k++){.    p
26490 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
264a0 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
264b0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52  pE->op==TK_ASTER
264c0 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ISK ) break;.   
264d0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
264e0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
264f0 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
26500 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
26510 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
26520 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
26530 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
26540 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
26550 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
26560 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
26570 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
26580 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70  k;.  }.  if( k<p
26590 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
265a0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
265b0 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
265c0 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
265d0 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
265e0 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
265f0 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
26600 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
26610 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
26620 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
26630 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
26640 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
26650 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
26660 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
26670 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
26680 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
26690 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
266a0 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
266b0 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   0;.    int flag
266c0 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  s = pParse->db->
266d0 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c  flags;.    int l
266e0 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67  ongNames = (flag
266f0 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
26700 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20  olNames)!=0.    
26710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26720 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51    && (flags & SQ
26730 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
26740 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72  es)==0;..    for
26750 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
26760 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
26770 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78     pE = a[k].pEx
26780 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  pr;.      pRight
26790 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
267a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
267b0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
267c0 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
267d0 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
267e0 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20  _ASTERISK.      
267f0 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
26800 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
26810 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a  p!=TK_ASTERISK).
26820 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26830 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
26840 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
26850 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
26860 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
26870 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26880 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
26890 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
268a0 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
268b0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
268c0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
268d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
268e0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
268f0 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
26900 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
26910 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
26920 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
26930 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
26940 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
26950 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
26960 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
26970 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
26980 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
26990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
269a0 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
269b0 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
269c0 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
269d0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
269e0 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
269f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
26a00 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
26a10 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
26a20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
26a30 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
26a40 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
26a50 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
26a60 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
26a70 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
26a80 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
26a90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26aa0 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
26ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
26ac0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
26ad0 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
26ae0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
26af0 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
26b00 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
26b10 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
26b20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
26b30 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
26b40 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
26b50 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
26b60 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
26b70 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
26b80 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
26b90 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
26ba0 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
26bb0 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
26bc0 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
26bd0 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
26be0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
26bf0 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
26c00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
26c10 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
26c20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
26c30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26c40 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
26c50 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
26c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26c70 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
26c80 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
26c90 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
26ca0 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
26cb0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
26cc0 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
26cd0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
26ce0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
26cf0 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
26d00 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
26d10 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
26d20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26d30 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26d40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26d50 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
26d60 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
26d70 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
26d80 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
26d90 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
26da0 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
26db0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a  [iDb].zName : "*
26dc0 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
26dd0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
26de0 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
26df0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
26e00 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
26e10 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
26e20 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
26e30 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
26e40 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
26e50 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
26e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
26e70 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
26e80 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
26e90 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
26ea0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
26eb0 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
26ec0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
26ed0 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
26ee0 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
26ef0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
26f00 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  t( zName );.    
26f10 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
26f20 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20  me && pSub.     
26f30 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
26f40 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
26f50 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
26f60 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e  j].zSpan, 0, zTN
26f70 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  ame, 0)==0.     
26f80 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
26f90 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
26fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
26fc0 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
26fd0 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
26fe0 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20  ', omit it from 
26ff0 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
27000 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
27010 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65  lt-set list unle
27020 73 73 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ss the SELECT ha
27030 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65  s the SF_Include
27040 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20  Hidden.         
27050 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20     ** bit set.. 
27060 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
27070 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
27080 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27090 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d  IncludeHidden)==
270a0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
270b0 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  & IsHiddenColumn
270c0 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29  (&pTab->aCol[j])
270d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
270e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
270f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
27100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27110 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
27120 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
27130 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
27140 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
27150 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
27160 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
27170 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20  T_NATURAL)!=0.  
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
27190 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
271a0 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69  ndex(pTabList, i
271b0 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20  , zName, 0, 0). 
271c0 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271e0 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
271f0 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
27200 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
27210 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
27220 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74        ** table t
27230 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74  o the right of t
27240 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20  he join */.     
27250 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
27260 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
27270 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27280 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
27290 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d  ListIndex(pFrom-
272a0 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
272b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
272c0 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
272d0 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
272e0 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
272f0 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
27300 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
27310 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
27320 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
27330 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
27340 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
27350 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
27360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27370 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
27380 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
27390 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
273a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
273b0 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a      zColname = z
273c0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
273d0 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20    zToFree = 0;. 
273e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
273f0 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
27400 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
27420 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr *pLeft;.     
27430 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
27440 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
27450 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65   TK_ID, zTabName
27460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
27470 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
27480 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
27490 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
274a0 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
274b0 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65         if( zSche
274c0 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  maName ){.      
274d0 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
274e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
274f0 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61  , TK_ID, zSchema
27500 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
27510 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
27520 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
27530 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
27540 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  t, pExpr, 0);.  
27550 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27560 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27570 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
27580 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
27590 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
275a0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
275b0 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
275c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
275d0 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
275e0 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
275f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27610 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
27620 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
27630 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27640 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
27650 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
27660 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
27670 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
27680 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
27690 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20  Init(&sColname, 
276a0 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
276b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
276c0 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
276d0 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
276e0 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
276f0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
27700 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
27710 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
27720 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
27730 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
27740 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20  List_item *pX = 
27750 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e  &pNew->a[pNew->n
27760 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20  Expr-1];.       
27770 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20         if( pSub 
27780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27790 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
277a0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
277b0 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  b, pSub->pEList-
277c0 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[j].zSpan);.  
277d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
277e0 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
277f0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
27800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27810 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
27820 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
27830 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
27840 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20  %s.%s",.        
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27870 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20     zSchemaName, 
27880 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  zTabName, zColna
27890 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
278a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
278b0 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
278d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
278e0 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b  >bSpanIsTab = 1;
278f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27900 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27910 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
27920 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
27930 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
27940 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
27950 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
27960 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
27970 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27980 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27990 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
279a0 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
279b0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
279c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
279d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
279e0 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
279f0 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
27a00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27a10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27a20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
27a30 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
27a40 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
27a50 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
27a60 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
27a70 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
27a80 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
27a90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d  EList->nExpr>db-
27aa0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
27ab0 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
27ac0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
27ad0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
27ae0 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
27af0 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
27b00 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
27b10 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ort;.  }.#endif.
27b20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
27b30 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
27b40 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
27b50 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
27b60 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
27b70 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27b80 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
27b90 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
27ba0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
27bb0 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
27bc0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
27bd0 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
27be0 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
27bf0 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
27c00 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27c10 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
27c20 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
27c30 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
27c40 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
27c50 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
27c60 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
27c70 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
27c80 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
27c90 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e  rser tree..*/.in
27ca0 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  t sqlite3ExprWal
27cb0 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
27cc0 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
27cd0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
27ce0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
27cf0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
27d00 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
27d10 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
27d20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
27d30 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
27d40 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
27d50 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
27d60 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
27d70 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
27d80 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
27d90 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
27da0 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
27db0 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
27dc0 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
27dd0 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
27de0 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
27df0 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
27e00 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
27e10 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
27e20 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
27e30 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
27e40 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
27e50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
27e60 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
27e70 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
27e80 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
27e90 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
27ea0 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
27eb0 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
27ec0 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
27ed0 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
27ee0 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
27ef0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
27f00 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
27f10 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
27f20 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
27f30 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
27f40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
27f50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
27f60 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
27f70 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
27f80 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
27f90 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
27fa0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
27fb0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
27fc0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
27fd0 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
27fe0 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
27ff0 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
28000 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
28010 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  und ){.    w.xSe
28020 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
28030 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
28040 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
28050 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
28060 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
28070 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c  t);.  }.  w.xSel
28080 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
28090 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
280a0 69 66 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  if( (pSelect->se
280b0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
280c0 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20  iValue)==0 ){.  
280d0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
280e0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70  ack2 = selectPop
280f0 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  With;.  }.  sqli
28100 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
28110 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
28120 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28130 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
28140 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
28150 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
28160 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
28170 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
28180 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
28190 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
281a0 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
281b0 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
281c0 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
281d0 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
281e0 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
281f0 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
28200 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
28210 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
28220 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
28230 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
28240 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
28250 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
28260 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
28270 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
28280 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
28290 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
282a0 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
282b0 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
282c0 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
282d0 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
282e0 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
282f0 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
28300 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
28310 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
28320 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
28330 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
28340 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
28350 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53   void selectAddS
28360 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
28370 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
28380 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
28390 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
283a0 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
283b0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
283c0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
283d0 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
283e0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
283f0 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
28400 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
28410 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
28420 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b  sTypeInfo)==0 );
28430 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
28440 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  = SF_HasTypeInfo
28450 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ;.  pParse = pWa
28460 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
28470 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
28480 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  rc;.  for(i=0, p
28490 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
284a0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
284b0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
284c0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
284d0 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
284e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
284f0 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
28500 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
28510 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
28520 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
28530 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
28540 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
28550 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
28560 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
28570 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
28580 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  t;.      if( pSe
28590 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  l ){.        whi
285a0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
285b0 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
285c0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
285d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
285e0 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
285f0 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
28600 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  Tab, pSel);.    
28610 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
28620 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
28630 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
28640 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
28650 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
28660 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
28670 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
28680 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
28690 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
286a0 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
286b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
286c0 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
286d0 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
286e0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
286f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
28700 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
28710 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
28720 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
28730 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
28740 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
28750 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
28760 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
28770 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
28780 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
28790 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71   = selectAddSubq
287a0 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20  ueryTypeInfo;.  
287b0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
287c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
287d0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
287e0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
287f0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
28800 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
28810 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
28820 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
28830 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61   up a SELECT sta
28840 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
28850 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
28860 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
28870 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
28880 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
28890 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
288a0 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
288b0 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
288c0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
288d0 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
288e0 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
288f0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
28900 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
28910 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
28920 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
28930 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
28940 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
28950 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
28960 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
28970 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
28980 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
28990 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
289a0 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
289b0 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
289c0 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
289d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
289e0 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
289f0 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
28a00 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
28a10 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
28a20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
28a30 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
28a40 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
28a50 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
28a60 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
28a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
28a80 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
28a90 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
28aa0 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
28ab0 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
28ac0 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
28ad0 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
28ae0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
28af0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
28b00 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
28b10 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
28b20 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
28b30 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
28b40 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
28b50 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
28b60 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
28b70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
28b80 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b  pand(pParse, p);
28b90 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
28ba0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
28bb0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
28bc0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
28bd0 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
28be0 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
28bf0 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  C);.  if( pParse
28c00 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
28c10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
28c20 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
28c30 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
28c40 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f  pParse, p);.}../
28c50 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
28c60 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
28c70 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
28c80 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
28c90 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
28ca0 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
28cb0 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
28cc0 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
28cd0 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
28ce0 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
28cf0 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
28d00 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
28d10 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c   that stores NUL
28d20 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
28d30 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c  se memory.** cel
28d40 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
28d50 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
28d60 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
28d70 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
28d80 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
28d90 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
28da0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
28db0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
28dc0 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e   *pFunc;.  int n
28dd0 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Reg = pAggInfo->
28de0 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f  nFunc + pAggInfo
28df0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28  ->nColumn;.  if(
28e00 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nReg==0 ) retur
28e10 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  n;.#ifdef SQLITE
28e20 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
28e30 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49  fy that all AggI
28e40 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72  nfo registers ar
28e50 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  e within the ran
28e60 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a  ge specified by.
28e70 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52    ** AggInfo.mnR
28e80 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65  eg..AggInfo.mxRe
28e90 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  g */.  assert( n
28ea0 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg==pAggInfo->m
28eb0 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d  xReg-pAggInfo->m
28ec0 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28  nReg+1 );.  for(
28ed0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
28ee0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
28ef0 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
28f00 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
28f10 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
28f20 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
28f30 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
28f40 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
28f50 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20  ->mxReg );.  }. 
28f60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
28f70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
28f80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
28f90 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
28fa0 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
28fb0 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
28fc0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   && pAggInfo->aF
28fd0 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  unc[i].iMem<=pAg
28fe0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
28ff0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
29000 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
29010 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41  , OP_Null, 0, pA
29020 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70  ggInfo->mnReg, p
29030 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b  AggInfo->mxReg);
29040 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
29050 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
29060 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
29070 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
29080 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75  ++){.    if( pFu
29090 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
290a0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
290b0 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
290c0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
290d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
290e0 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pE, EP_xIsSele
290f0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
29100 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20   pE->x.pList==0 
29110 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pE->x.pList->
29120 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
29130 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
29140 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
29150 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73  TINCT aggregates
29160 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
29170 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20  ly one ".       
29180 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b      "argument");
29190 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
291a0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
291b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
291c0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
291d0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
291e0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
291f0 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  rse, pE->x.pList
29200 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
29210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29220 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
29230 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
29240 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  Distinct, 0, 0,.
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
29270 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
29280 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
29290 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
292a0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
292b0 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
292c0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
292d0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
292e0 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
292f0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
29300 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
29310 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
29320 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
29330 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
29340 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
29350 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
29360 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
29370 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
29380 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
29390 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
293a0 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
293b0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
293c0 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
293d0 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
293e0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
293f0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
29400 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
29410 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
29420 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
29430 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
29440 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
29450 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
29460 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30  st->nExpr : 0, 0
29470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29480 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
29490 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
294a0 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
294b0 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
294c0 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
294d0 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
294e0 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
294f0 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
29500 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
29510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29520 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
29530 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
29540 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
29550 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
29560 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
29570 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
29580 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e  regHit = 0;.  in
29590 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20  t addrHitTest = 
295a0 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  0;.  struct AggI
295b0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
295c0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
295d0 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
295e0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
295f0 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 1;.  for(i=0, 
29600 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
29610 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
29620 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
29630 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
29640 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
29650 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
29660 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
29670 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
29680 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
29690 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
296a0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
296b0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
296c0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
296d0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
296e0 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
296f0 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
29700 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
29710 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
29720 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
29730 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
29740 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
29750 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20  ist, regAgg, 0, 
29760 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
29770 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29780 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20     nArg = 0;.   
29790 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20     regAgg = 0;. 
297a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
297b0 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
297c0 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
297d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
297e0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
297f0 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d   testcase( nArg=
29800 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20  =0 );  /* Error 
29810 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20  condition */.   
29820 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72     testcase( nAr
29830 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f  g>1 );   /* Also
29840 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
29850 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
29860 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
29870 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
29880 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
29890 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
298a0 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
298b0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
298c0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
298d0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
298e0 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
298f0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
29900 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
29910 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
29920 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
29930 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
29940 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
29950 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
29960 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
29970 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
29980 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
29990 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
299a0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
299b0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
299c0 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
299d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
299e0 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
299f0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
29a00 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
29a10 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
29a20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30     if( regHit==0
29a30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41   && pAggInfo->nA
29a40 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67  ccumulator ) reg
29a50 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Hit = ++pParse->
29a60 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
29a70 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
29a80 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67   OP_CollSeq, reg
29a90 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Hit, 0, 0, (char
29aa0 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
29ab0 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LSEQ);.    }.   
29ac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29ad0 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p4(v, OP_AggStep
29ae0 30 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  0, 0, regAgg, pF
29af0 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
29b10 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
29b20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
29b30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
29b40 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
29b50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
29b60 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
29b70 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
29b80 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
29b90 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
29ba0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
29bb0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
29bc0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
29bd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29be0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
29bf0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
29c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29c10 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
29c20 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
29c30 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
29c40 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
29c50 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
29c60 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
29c70 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
29c80 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
29c90 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
29ca0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
29cb0 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
29cc0 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
29cd0 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
29ce0 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
29cf0 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
29d00 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
29d10 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
29d20 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
29d30 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
29d40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
29d50 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
29d60 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
29d70 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
29d80 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
29d90 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
29da0 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
29db0 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
29dc0 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
29dd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
29de0 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
29df0 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
29e00 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
29e10 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
29e20 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
29e30 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
29e40 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
29e50 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
29e60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
29e70 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
29e80 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  gHit); VdbeCover
29e90 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
29ea0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
29eb0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
29ec0 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
29ed0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
29ee0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
29ef0 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
29f00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
29f10 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
29f20 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
29f30 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
29f40 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
29f50 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
29f60 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
29f70 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69  e);.  if( addrHi
29f80 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c  tTest ){.    sql
29f90 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
29fa0 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29  (v, addrHitTest)
29fb0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
29fc0 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45  dd a single OP_E
29fd0 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
29fe0 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74  on to the VDBE t
29ff0 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70  o explain a simp
2a000 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71  le.** count(*) q
2a010 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f  uery ("SELECT co
2a020 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62  unt(*) FROM pTab
2a030 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ")..*/.#ifndef S
2a040 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
2a050 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  IN.static void e
2a060 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2a070 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
2a080 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2a090 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
2a0a0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
2a0b0 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
2a0c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
2a0d0 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
2a0e0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
2a0f0 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
2a100 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2a110 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
2a120 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a   scan, or NULL *
2a130 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
2a140 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
2a150 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20  .    int bCover 
2a160 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48  = (pIdx!=0 && (H
2a170 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
2a180 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
2a190 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20  dex(pIdx)));.   
2a1a0 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71   char *zEqp = sq
2a1b0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
2a1c0 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54  rse->db, "SCAN T
2a1d0 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20  ABLE %s%s%s",.  
2a1e0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
2a1f0 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  e,.        bCove
2a200 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45  r ? " USING COVE
2a210 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22  RING INDEX " : "
2a220 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  ",.        bCove
2a230 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  r ? pIdx->zName 
2a240 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  : "".    );.    
2a250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a260 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  4(.        pPars
2a270 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70  e->pVdbe, OP_Exp
2a280 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
2a290 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
2a2a0 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  Eqp, P4_DYNAMIC.
2a2b0 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
2a2c0 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
2a2d0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
2a2e0 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
2a2f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
2a300 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e for the SELECT
2a310 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
2a320 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65   in the p argume
2a330 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nt.  .**.** The 
2a340 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75  results are retu
2a350 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  rned according t
2a360 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  o the SelectDest
2a370 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53   structure..** S
2a380 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73  ee comments in s
2a390 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66  qliteInt.h for f
2a3a0 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
2a3b0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
2a3c0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
2a3d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2a3e0 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
2a3f0 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
2a400 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
2a410 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
2a420 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
2a430 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
2a440 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
2a450 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2a460 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
2a470 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
2a480 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
2a490 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
2a4a0 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
2a4b0 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hat..*/.int sqli
2a4c0 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
2a4d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2a4e0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2a4f0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
2a500 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
2a510 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
2a520 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
2a530 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
2a540 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
2a550 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t      /* What t
2a560 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
2a570 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
2a580 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
2a590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2a5a0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2a5b0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2a5c0 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
2a5d0 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
2a5e0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
2a5f0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
2a600 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2a610 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
2a620 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
2a630 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
2a640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a650 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
2a660 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
2a670 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
2a680 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b  ist *pEList = 0;
2a690 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
2a6a0 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
2a6b0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
2a6c0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
2a6d0 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
2a6e0 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
2a6f0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
2a700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a710 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2a720 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
2a730 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
2a740 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
2a750 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
2a760 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
2a770 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
2a780 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a790 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
2a7a0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
2a7b0 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
2a7c0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2a7d0 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
2a7e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
2a7f0 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73  .  DistinctCtx s
2a800 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66  Distinct; /* Inf
2a810 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
2a820 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
2a830 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43  yword */.  SortC
2a840 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20  tx sSort;       
2a850 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77    /* Info on how
2a860 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44   to code the ORD
2a870 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2a880 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
2a890 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
2a8a0 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
2a8b0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
2a8c0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
2a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a8e0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
2a8f0 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
2a900 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2a910 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
2a920 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
2a930 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e  nection */..#ifn
2a940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a950 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52  EXPLAIN.  int iR
2a960 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d  estoreSelectId =
2a970 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
2a980 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53  Id;.  pParse->iS
2a990 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
2a9a0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b  ->iNextSelectId+
2a9b0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20  +;.#endif..  db 
2a9c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2a9d0 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
2a9e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
2a9f0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
2aa00 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2aa10 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
2aa20 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
2aa30 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
2aa40 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
2aa50 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
2aa60 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
2aa70 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23  of(sAggInfo));.#
2aa80 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2aa90 4e 41 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d  NABLED.  pParse-
2aaa0 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b  >nSelectIndent++
2aab0 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  ;.  SELECTTRACE(
2aac0 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65  1,pParse,p, ("be
2aad0 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c  gin processing:\
2aae0 6e 22 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  n"));.  if( sqli
2aaf0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2ab00 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71   0x100 ){.    sq
2ab10 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2ab20 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2ab30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
2ab40 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2ab50 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2ab60 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st!=SRT_DistFifo
2ab70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2ab80 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2ab90 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2aba0 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  T_Fifo );.  asse
2abb0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2abc0 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2abd0 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st!=SRT_DistQueu
2abe0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
2abf0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2ac00 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2ac10 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66  RT_Queue );.  if
2ac20 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
2ac30 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2ac40 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65   assert(pDest->e
2ac50 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73  Dest==SRT_Exists
2ac60 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2ac70 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a  ==SRT_Union || .
2ac80 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2ac90 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63  ->eDest==SRT_Exc
2aca0 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ept || pDest->eD
2acb0 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
2acc0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
2acd0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2ace0 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74  _Queue  || pDest
2acf0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2ad00 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20  tFifo ||.       
2ad10 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2ad20 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ==SRT_DistQueue 
2ad30 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2ad40 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20  =SRT_Fifo);.    
2ad50 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
2ad60 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
2ad70 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
2ad80 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
2ad90 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
2ada0 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
2adb0 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
2adc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2add0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
2ade0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
2adf0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
2ae00 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
2ae10 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
2ae20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
2ae30 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
2ae40 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65  , p, 0);.  memse
2ae50 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a  t(&sSort, 0, siz
2ae60 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73  eof(sSort));.  s
2ae70 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2ae80 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
2ae90 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2aea0 63 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  c;.  if( pParse-
2aeb0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
2aec0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2aed0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2aee0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2aef0 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
2af00 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65    isAgg = (p->se
2af10 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2af20 65 67 61 74 65 29 21 3d 30 3b 0a 23 69 66 20 53  egate)!=0;.#if S
2af30 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2af40 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
2af50 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2af60 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  100 ){.    SELEC
2af70 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2af80 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e  rse,p, ("after n
2af90 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c  ame resolution:\
2afa0 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
2afb0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2afc0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2afd0 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20 49 66 20 77  ndif...  /* If w
2afe0 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
2aff0 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
2b000 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
2b010 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
2b020 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
2b030 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2b040 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2b050 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
2b060 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
2b070 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
2b080 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  st, p->pEList->n
2b090 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74  Expr) ){.    got
2b0a0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2b0b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54  }.#endif..  /* T
2b0c0 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ry to flatten su
2b0d0 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  bqueries in the 
2b0e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69  FROM clause up i
2b0f0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65  nto the main que
2b100 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  ry.  */.#if !def
2b110 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2b120 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
2b130 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2b140 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
2b150 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
2b160 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
2b170 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2b180 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b190 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2b1a0 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2b1b0 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2b1c0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2b1d0 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
2b1e0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2b1f0 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
2b200 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2b210 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
2b220 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74   /* Catch mismat
2b230 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72  ch in the declar
2b240 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20  ed columns of a 
2b250 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d  view and the num
2b260 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f  ber of.    ** co
2b270 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  lumns in the SEL
2b280 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a  ECT on the RHS *
2b290 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  /.    if( pTab->
2b2a0 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69  nCol!=pSub->pELi
2b2b0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
2b2c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b2d0 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65  sg(pParse, "expe
2b2e0 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
2b2f0 66 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74  for '%s' but got
2b300 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
2b310 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
2b320 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e  ->nCol, pTab->zN
2b330 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ame, pSub->pELis
2b340 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
2b350 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2b360 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 41  ;.    }..    isA
2b370 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73  ggSub = (pSub->s
2b380 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2b390 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20  regate)!=0;.    
2b3a0 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
2b3b0 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
2b3c0 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75  , isAgg, isAggSu
2b3d0 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
2b3e0 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
2b3f0 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
2b400 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
2b410 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
2b420 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
2b430 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
2b440 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2b450 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
2b460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
2b470 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
2b480 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2b490 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  c;.    if( db->m
2b4a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2b4b0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2b4c0 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
2b4d0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2b4e0 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  ){.      sSort.p
2b4f0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2b500 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
2b510 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
2b520 74 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20  t a pointer the 
2b530 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
2b540 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ruction, allocat
2b550 69 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69  ing a new VDBE i
2b560 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20  f one.  ** does 
2b570 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
2b580 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  t */.  v = sqlit
2b590 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2b5a0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
2b5b0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2b5c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2b5d0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2b5e0 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c  ELECT.  /* Handl
2b5f0 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
2b600 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  T statements usi
2b610 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ng the separate 
2b620 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20  multiSelect().  
2b630 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20  ** procedure..  
2b640 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
2b650 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
2b660 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
2b670 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
2b680 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2b690 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2b6a0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2b6b0 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45  electId);.#if SE
2b6c0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2b6d0 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
2b6e0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
2b6f0 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
2b700 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
2b710 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
2b720 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
2b730 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2b740 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2b750 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
2b760 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
2b770 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
2b780 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
2b790 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2b7a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2b7b0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2b7c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2b7d0 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  W).  for(i=0; i<
2b7e0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2b7f0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2b800 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2b810 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2b820 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
2b830 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
2b840 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
2b850 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
2b860 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2b870 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
2b880 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68   /* Sometimes th
2b890 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62  e code for a sub
2b8a0 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65  query will be ge
2b8b0 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61  nerated more tha
2b8c0 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69  n.    ** once, i
2b8d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2b8e0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48  s part of the WH
2b8f0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ERE clause in a 
2b900 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a  LEFT JOIN,.    *
2b910 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  * for example.  
2b920 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f  In that case, do
2b930 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20   not regenerate 
2b940 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69  the code to mani
2b950 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69  fest.    ** a vi
2b960 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75  ew or the co-rou
2b970 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tine to implemen
2b980 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66  t a view.  The f
2b990 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20  irst instance.  
2b9a0 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65    ** is sufficie
2b9b0 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73  nt, though the s
2b9c0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e  ubroutine to man
2b9d0 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64  ifest the view d
2b9e0 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  oes need.    ** 
2b9f0 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67  to be invoked ag
2ba00 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
2ba10 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2ba20 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ub ){.      if( 
2ba30 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
2ba40 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  outine==0 ){.   
2ba50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ba60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2ba70 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ub, pItem->regRe
2ba80 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64  turn, pItem->add
2ba90 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20  rFillSub);.     
2baa0 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75   }.      continu
2bab0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
2bac0 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
2bad0 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
2bae0 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
2baf0 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
2bb00 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
2bb10 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  erred to by this
2bb20 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
2bb30 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
2bb40 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
2bb50 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
2bb60 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
2bb70 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
2bb80 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
2bb90 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
2bba0 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
2bbb0 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
2bbc0 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
2bbd0 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
2bbe0 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
2bbf0 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
2bc00 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
2bc10 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
2bc20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
2bc30 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
2bc40 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
2bc50 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f  ..    /* Make co
2bc60 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74  pies of constant
2bc70 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65   WHERE-clause te
2bc80 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  rms in the outer
2bc90 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20   query down.    
2bca0 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75  ** inside the su
2bcb0 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61  bquery.  This ca
2bcc0 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75  n help the subqu
2bcd0 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20  ery to run more 
2bce0 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20  efficiently..   
2bcf0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74   */.    if( (pIt
2bd00 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
2bd10 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20  & JT_OUTER)==0. 
2bd20 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57      && pushDownW
2bd30 68 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70 53  hereTerms(db, pS
2bd40 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  ub, p->pWhere, p
2bd50 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20  Item->iCursor). 
2bd60 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54     ){.#if SELECT
2bd70 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2bd80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2bd90 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
2bda0 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45  00 ){.        SE
2bdb0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
2bdc0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
2bdd0 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75   WHERE-clause pu
2bde0 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20  sh-down:\n"));. 
2bdf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
2be00 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2be10 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  p, 0);.      }.#
2be20 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
2be30 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2be40 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
2be50 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
2be60 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75  **.    ** The su
2be70 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d  bquery is implem
2be80 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
2be90 75 74 69 6e 65 20 69 66 20 61 6c 6c 20 6f 66 20  utine if all of 
2bea0 74 68 65 73 65 20 61 72 65 20 74 72 75 65 3a 0a  these are true:.
2beb0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 54 68      **   (1)  Th
2bec0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 67 75  e subquery is gu
2bed0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74  aranteed to be t
2bee0 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73  he outer loop (s
2bef0 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a 2a  o that it.    **
2bf00 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74          does not
2bf10 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6d 70   need to be comp
2bf20 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f  uted more than o
2bf30 6e 63 65 29 0a 20 20 20 20 2a 2a 20 20 20 28 32  nce).    **   (2
2bf40 29 20 20 54 68 65 20 41 4c 4c 20 6b 65 79 77 6f  )  The ALL keywo
2bf50 72 64 20 61 66 74 65 72 20 53 45 4c 45 43 54 20  rd after SELECT 
2bf60 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 28 41 70  is omitted.  (Ap
2bf70 70 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 0a 20  plications are. 
2bf80 20 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6c 6c     **        all
2bf90 6f 77 65 64 20 74 6f 20 73 61 79 20 22 53 45 4c  owed to say "SEL
2bfa0 45 43 54 20 41 4c 4c 22 20 69 6e 73 74 65 61 64  ECT ALL" instead
2bfb0 20 6f 66 20 6a 75 73 74 20 22 53 45 4c 45 43 54   of just "SELECT
2bfc0 22 20 74 6f 20 64 69 73 61 62 6c 65 0a 20 20 20  " to disable.   
2bfd0 20 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 75   **        the u
2bfe0 73 65 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65  se of co-routine
2bff0 73 2e 29 0a 20 20 20 20 2a 2a 20 20 20 28 33 29  s.).    **   (3)
2c000 20 20 43 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72    Co-routines ar
2c010 65 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 20 75  e not disabled u
2c020 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 74 65 73  sing sqlite3_tes
2c030 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 20 20 20 20  t_control().    
2c040 2a 2a 20 20 20 20 20 20 20 20 77 69 74 68 20 53  **        with S
2c050 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2c060 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2e 0a 20 20  PTIMIZATIONS..  
2c070 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    **.    ** TODO
2c080 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65  : Are there othe
2c090 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65  r reasons beside
2c0a0 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f   (1) to use a co
2c0b0 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20  -routine.    ** 
2c0c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a  implementation?.
2c0d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
2c0e0 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61  ==0.     && (pTa
2c0f0 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20  bList->nSrc==1. 
2c100 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
2c110 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67  TabList->a[1].fg
2c120 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45  .jointype&(JT_LE
2c130 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
2c140 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20  )  /* (1) */.   
2c150 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67    && (p->selFlag
2c160 73 20 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 20 20  s & SF_All)==0  
2c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c190 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
2c1a0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2c1b0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2c1c0 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29  E_SubqCoroutine)
2c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c1e0 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 29 7b 0a  * (3) */.    ){.
2c1f0 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65        /* Impleme
2c200 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  nt a co-routine 
2c210 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e  that will return
2c220 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2c230 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2c240 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68    ** set on each
2c250 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
2c260 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
2c270 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
2c280 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2c290 28 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74  (v)+1;.      pIt
2c2a0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2c2b0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2c2c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c2d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
2c2e0 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  itCoroutine, pIt
2c2f0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30  em->regReturn, 0
2c300 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
2c310 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2c320 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  , "%s", pItem->p
2c330 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2c340 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
2c350 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70  illSub = addrTop
2c360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2c370 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
2c380 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
2c390 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2c3a0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70  turn);.      exp
2c3b0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2c3c0 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
2c3d0 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
2c3e0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
2c3f0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2c400 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
2c410 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
2c420 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
2c430 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65  gEst = pSub->nSe
2c440 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70  lectRow;.      p
2c450 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2c460 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  utine = 1;.     
2c470 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c   pItem->regResul
2c480 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
2c490 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c4a0 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
2c4b0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2c4c0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
2c4d0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2c4e0 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20   addrTop-1);.   
2c4f0 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
2c500 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
2c510 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
2c520 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2c530 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
2c540 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e  hat will fill an
2c550 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2c560 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74   with.      ** t
2c570 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2c580 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49  is subquery.  pI
2c590 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2c5a0 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20   will point.    
2c5b0 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72    ** to the addr
2c5c0 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ess of the gener
2c5d0 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e  ated subroutine.
2c5e0 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2c5f0 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  rn.      ** is a
2c600 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
2c610 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2c620 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
2c630 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20  n address.      
2c640 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70  */.      int top
2c650 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Addr;.      int 
2c660 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  onceAddr = 0;.  
2c670 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b      int retAddr;
2c680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2c690 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2c6a0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49  b==0 );.      pI
2c6b0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
2c6c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2c6d0 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d  .      topAddr =
2c6e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c6f0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2c700 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  , 0, pItem->regR
2c710 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49  eturn);.      pI
2c720 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2c730 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20   = topAddr+1;.  
2c740 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
2c750 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d  g.isCorrelated==
2c760 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2c770 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
2c780 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65  is not correlate
2c790 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20  d and if we are 
2c7a0 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20  not inside of.  
2c7b0 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
2c7c0 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79  er, then we only
2c7d0 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
2c7e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2c7f0 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20  e subquery.     
2c800 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20     ** once. */. 
2c810 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20         onceAddr 
2c820 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
2c830 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
2c840 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2c850 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c860 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
2c870 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
2c880 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2c890 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c8a0 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
2c8b0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
2c8c0 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
2c8d0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2c8e0 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
2c8f0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2c900 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2c910 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
2c920 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2c930 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2c940 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2c950 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
2c960 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2c970 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
2c980 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
2c990 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
2c9a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
2c9b0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70  ->nRowLogEst = p
2c9c0 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
2c9d0 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41  .      if( onceA
2c9e0 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62  ddr ) sqlite3Vdb
2c9f0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63  eJumpHere(v, onc
2ca00 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65  eAddr);.      re
2ca10 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
2ca20 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2ca30 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72  Return, pItem->r
2ca40 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2ca50 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2ca60 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d   "end %s", pItem
2ca70 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2ca80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ca90 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f  beChangeP1(v, to
2caa0 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b  pAddr, retAddr);
2cab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
2cac0 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
2cad0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
2cae0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2caf0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
2cb00 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70  elect_end;.    p
2cb10 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
2cb20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
2cb30 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
2cb40 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56  }.#endif..  /* V
2cb50 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20  arious elements 
2cb60 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f  of the SELECT co
2cb70 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20  pied into local 
2cb80 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20  variables for.  
2cb90 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a  ** convenience *
2cba0 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
2cbb0 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65  pEList;.  pWhere
2cbc0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
2cbd0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
2cbe0 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
2cbf0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
2cc00 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e    sDistinct.isTn
2cc10 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
2cc20 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
2cc30 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  !=0;..#if SELECT
2cc40 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2cc50 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2cc60 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
2cc70 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2cc80 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
2cc90 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f  ,("After all FRO
2cca0 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69  M-clause analysi
2ccb0 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  s:\n"));.    sql
2ccc0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2ccd0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2cce0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2ccf0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
2cd00 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
2cd10 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
2cd20 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
2cd30 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
2cd40 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
2cd50 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2cd60 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
2cd70 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
2cd80 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
2cd90 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
2cda0 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
2cdb0 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
2cdc0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2cdd0 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
2cde0 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
2cdf0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
2ce00 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
2ce10 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
2ce20 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
2ce30 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
2ce40 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
2ce50 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
2ce60 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
2ce70 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
2ce80 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
2ce90 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
2cea0 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
2ceb0 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
2cec0 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
2ced0 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
2cee0 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
2cef0 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
2cf00 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
2cf10 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
2cf20 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
2cf30 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
2cf40 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
2cf50 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
2cf60 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
2cf70 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
2cf80 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
2cf90 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
2cfa0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
2cfb0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
2cfc0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
2cfd0 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
2cfe0 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
2cff0 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
2d000 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2d010 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2d020 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
2d030 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
2d040 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2d050 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
2d060 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
2d070 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
2d080 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
2d090 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
2d0a0 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
2d0b0 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
2d0c0 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
2d0d0 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
2d0e0 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
2d0f0 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
2d100 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
2d110 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
2d120 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
2d130 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
2d140 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
2d150 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2d160 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
2d170 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2d180 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2d190 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
2d1a0 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
2d1b0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2d1c0 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44  ,p,("Transform D
2d1d0 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f  ISTINCT into GRO
2d1e0 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20  UP BY:\n"));.   
2d1f0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2d200 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2d210 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2d220 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2d230 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
2d240 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
2d250 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
2d260 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
2d270 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
2d280 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
2d290 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
2d2a0 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
2d2b0 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
2d2c0 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
2d2d0 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
2d2e0 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
2d2f0 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
2d300 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2d310 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
2d320 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
2d330 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
2d340 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
2d350 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
2d360 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
2d370 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2d380 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
2d390 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
2d3a0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
2d3b0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
2d3c0 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
2d3d0 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
2d3e0 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
2d3f0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2d400 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2d410 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
2d420 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2d430 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53  rList(pParse, sS
2d440 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
2d450 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
2d460 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
2d470 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
2d480 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
2d490 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
2d4a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d4b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2d4c0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
2d4d0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
2d4e0 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
2d4f0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
2d500 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
2d510 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
2d520 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2d530 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
2d540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
2d550 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2d560 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
2d570 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
2d580 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
2d590 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2d5a0 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
2d5b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
2d5c0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d5d0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
2d5e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d5f0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
2d600 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
2d610 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
2d620 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
2d630 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
2d640 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
2d650 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2d660 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53  abel(v);.  p->nS
2d670 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20  electRow = 320; 
2d680 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f   /* 4 billion ro
2d690 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  ws */.  computeL
2d6a0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
2d6b0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
2d6c0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
2d6d0 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
2d6e0 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
2d6f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2d700 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
2d710 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2d720 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
2d730 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
2d740 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
2d750 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
2d760 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
2d770 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
2d780 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
2d790 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
2d7a0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
2d7b0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2d7c0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
2d7d0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
2d7e0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2d7f0 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
2d800 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
2d810 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2d820 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d840 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
2d850 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
2d860 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d880 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46   (char*)keyInfoF
2d890 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2d8a0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
2d8b0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
2d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8d0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2d8e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2d8f0 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
2d900 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
2d910 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2d920 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
2d930 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
2d940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
2d950 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2d960 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2d970 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
2d980 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
2d990 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
2d9a0 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
2d9b0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
2d9c0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
2d9d0 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
2d9e0 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
2d9f0 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
2da00 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
2da10 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
2da20 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  ( WHERE_USE_LIMI
2da30 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  T==SF_FixedLimit
2da40 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   );.    wctrlFla
2da50 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  gs |= p->selFlag
2da60 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
2da70 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  t;..    /* Begin
2da80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2da90 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66  an. */.    pWInf
2daa0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2dab0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2dac0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2dad0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a  sSort.pOrderBy,.
2dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2db00 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46  ->pEList, wctrlF
2db10 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74  lags, p->nSelect
2db20 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Row);.    if( pW
2db30 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
2db40 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
2db50 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
2db60 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
2db70 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
2db80 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
2db90 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
2dba0 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
2dbb0 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
2dbc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2dbd0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2dbe0 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
2dbf0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
2dc00 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
2dc10 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
2dc20 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2dc30 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
2dc40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2dc50 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2dc60 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
2dc70 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
2dc80 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2dc90 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f  Info);.      sSo
2dca0 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  rt.bOrderedInner
2dcb0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68  Loop = sqlite3Wh
2dcc0 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ereOrderedInnerL
2dcd0 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  oop(pWInfo);.   
2dce0 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
2dcf0 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
2dd00 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
2dd10 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2dd20 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2dd30 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2dd40 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
2dd50 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
2dd60 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
2dd70 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
2dd80 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
2dd90 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
2dda0 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
2ddb0 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
2ddc0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
2ddd0 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
2dde0 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
2ddf0 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
2de00 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
2de10 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
2de20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2de30 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
2de40 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
2de50 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
2de60 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
2de70 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
2de80 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c  loop. */.    sel
2de90 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2dea0 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
2deb0 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69  -1, &sSort, &sDi
2dec0 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dee0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
2def0 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
2df00 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
2df10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2df20 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
2df30 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
2df40 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
2df50 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
2df60 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2df70 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2df80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2df90 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
2dfa0 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
2dfb0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2dfc0 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
2dfd0 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
2dfe0 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
2dff0 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
2e000 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
2e010 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
2e020 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
2e030 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
2e040 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
2e050 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
2e060 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
2e070 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
2e080 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
2e090 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
2e0a0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
2e0b0 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
2e0c0 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
2e0d0 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
2e0e0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
2e0f0 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
2e100 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2e110 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
2e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e130 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
2e140 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
2e150 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
2e160 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
2e170 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
2e180 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
2e190 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
2e1a0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
2e1b0 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
2e1c0 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
2e1d0 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
2e1e0 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
2e1f0 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
2e200 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
2e210 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
2e220 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
2e230 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
2e240 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
2e250 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
2e260 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
2e270 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
2e280 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
2e290 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
2e2a0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
2e2b0 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
2e2c0 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
2e2d0 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
2e2e0 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
2e2f0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20  orderByGrp = 0; 
2e300 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47  /* True if the G
2e310 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45  ROUP BY and ORDE
2e320 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d  R BY are the sam
2e330 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  e */..    /* Rem
2e340 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
2e350 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
2e360 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
2e370 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
2e380 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
2e390 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
2e3a0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2e3b0 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
2e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e3d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2e3e0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
2e3f0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2e400 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
2e410 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
2e420 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
2e430 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
2e440 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
2e450 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
2e460 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
2e470 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2e480 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
2e490 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
2e4a0 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
2e4b0 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
2e4c0 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
2e4d0 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2e4e0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2e4f0 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2e500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e510 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69  assert( 66==sqli
2e520 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
2e530 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
2e540 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70  SelectRow>66 ) p
2e550 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36  ->nSelectRow = 6
2e560 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
2e570 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
2e580 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
2e590 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  );.      p->nSel
2e5a0 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
2e5b0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
2e5c0 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
2e5d0 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
2e5e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
2e5f0 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
2e600 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
2e610 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
2e620 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
2e630 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2e640 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
2e650 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
2e660 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
2e670 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
2e680 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
2e690 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
2e6a0 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
2e6b0 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
2e6c0 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
2e6d0 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61  se a.    ** data
2e6e0 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20  base index that 
2e6f0 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62  causes rows to b
2e700 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
2e710 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20  er as required. 
2e720 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63     ** but not ac
2e730 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45  tually sorted. E
2e740 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72  ither way, recor
2e750 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
2e760 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52  the.    ** ORDER
2e770 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
2e780 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
2e790 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
2e7a0 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
2e7b0 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
2e7c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
2e7d0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2e7e0 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53  are(pGroupBy, sS
2e7f0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
2e800 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72  )==0 ){.      or
2e810 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20  derByGrp = 1;.  
2e820 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65    }. .    /* Cre
2e830 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
2e840 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
2e850 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
2e860 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
2e870 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
2e880 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2e890 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
2e8a0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2e8b0 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
2e8c0 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
2e8d0 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
2e8e0 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
2e8f0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
2e900 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
2e910 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
2e920 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2e930 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
2e940 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
2e950 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
2e960 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
2e970 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
2e980 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
2e990 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
2e9a0 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
2e9b0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ;.    sAggInfo.m
2e9c0 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
2e9d0 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
2e9e0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2e9f0 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
2ea00 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
2ea10 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
2ea20 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
2ea30 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
2ea40 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2ea50 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
2ea60 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
2ea70 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2ea80 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
2ea90 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
2eaa0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
2eab0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2eac0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
2ead0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
2eae0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2eaf0 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
2eb00 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
2eb10 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
2eb20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
2eb30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
2eb40 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2eb50 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
2eb60 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
2eb70 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2eb80 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
2eb90 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
2eba0 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
2ebb0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2ebc0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
2ebd0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
2ebe0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
2ebf0 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
2ec00 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
2ec10 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
2ec20 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
2ec30 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
2ec40 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2ec50 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
2ec60 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  _end;..    /* Pr
2ec70 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
2ec80 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
2ec90 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
2eca0 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
2ecb0 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
2ecc0 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
2ecd0 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
2ece0 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
2ecf0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2ed00 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
2ed10 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
2ed20 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
2ed30 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
2ed40 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  p by clause */. 
2ed50 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20       int addr1; 
2ed60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73           /* A-vs
2ed70 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a  -B comparision j
2ed80 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ump */.      int
2ed90 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
2eda0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
2edb0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
2edc0 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
2edd0 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  w */.      int r
2ede0 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f  egOutputRow;   /
2edf0 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
2ee00 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75   register for ou
2ee10 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
2ee20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2ee30 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20  rSetAbort;   /* 
2ee40 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
2ee50 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
2ee60 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2ee70 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f  opOfLoop;  /* To
2ee80 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  p of the input l
2ee90 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  oop */.      int
2eea0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
2eeb0 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
2eec0 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
2eed0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
2eee0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2eef0 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  Reset;      /* S
2ef00 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
2ef10 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
2ef20 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  mulator */.     
2ef30 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20   int regReset;  
2ef40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
2ef50 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
2ef60 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75  for reset subrou
2ef70 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  tine */..      /
2ef80 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
2ef90 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
2efa0 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
2efb0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
2efc0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
2efd0 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
2efe0 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
2eff0 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
2f000 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
2f010 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
2f020 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
2f030 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72   all, the OP_Sor
2f040 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74  terOpen instruct
2f050 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
2f060 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
2f070 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
2f080 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
2f090 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2f0a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2f0b0 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
2f0c0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
2f0d0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2f0e0 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67  pGroupBy, 0, sAg
2f0f0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a  gInfo.nColumn);.
2f100 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
2f110 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
2f120 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
2f130 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
2f140 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2f150 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
2f160 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2f170 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
2f180 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
2f190 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2f1a0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
2f1b0 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
2f1c0 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
2f1d0 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
2f1e0 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
2f1f0 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
2f200 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
2f210 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
2f220 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
2f230 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
2f240 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
2f250 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2f260 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2f270 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
2f280 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2f290 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
2f2a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2f2b0 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
2f2c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2f2d0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
2f2e0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
2f2f0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2f300 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2f310 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2f320 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
2f330 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
2f340 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
2f350 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
2f360 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
2f370 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f380 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2f390 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
2f3a0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2f3b0 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
2f3c0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2f3d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f3e0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2f3f0 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
2f400 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2f410 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
2f420 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
2f430 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2f440 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2f450 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
2f460 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
2f470 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
2f480 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
2f490 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
2f4a0 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
2f4b0 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
2f4c0 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
2f4d0 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
2f4e0 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
2f4f0 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
2f500 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
2f510 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
2f520 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
2f530 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
2f540 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
2f550 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
2f560 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
2f570 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
2f580 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
2f590 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2f5a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f5b0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2f5c0 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2f5d0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
2f5e0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2f5f0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2f600 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
2f610 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20  roupBy, 0,.     
2f620 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50       WHERE_GROUP
2f630 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70  BY | (orderByGrp
2f640 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   ? WHERE_SORTBYG
2f650 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20  ROUP : 0), 0.   
2f660 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
2f670 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2f680 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2f690 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2f6a0 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2f6b0 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e  nfo)==pGroupBy->
2f6c0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2f6d0 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
2f6e0 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
2f6f0 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
2f700 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
2f710 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
2f720 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
2f730 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
2f740 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2f750 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
2f760 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
2f770 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
2f780 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
2f790 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
2f7a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
2f7b0 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
2f7c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f7d0 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
2f7e0 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
2f7f0 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
2f800 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
2f810 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
2f820 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
2f830 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
2f840 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
2f850 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
2f860 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
2f870 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2f880 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
2f890 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
2f8a0 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
2f8b0 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
2f8c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2f8d0 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
2f8e0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
2f8f0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
2f900 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
2f910 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
2f920 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2f930 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
2f940 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
2f950 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
2f960 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
2f970 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
2f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f990 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
2f9a0 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
2f9b0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2f9c0 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
2f9d0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
2f9e0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2f9f0 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b  nCol = nGroupBy;
2fa00 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2fa10 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
2fa20 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2fa30 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
2fa40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2fa50 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
2fa60 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
2fa70 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2fa80 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
2fa90 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2faa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2fab0 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
2fac0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2fad0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
2fae0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2faf0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2fb00 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2fb10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2fb20 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
2fb30 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
2fb40 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  gBase, 0, 0);.  
2fb50 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
2fb60 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
2fb70 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
2fb80 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
2fb90 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2fba0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
2fbb0 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
2fbc0 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
2fbd0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
2fbe0 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
2fbf0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
2fc00 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b  1 = j + regBase;
2fc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2fc20 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
2fc30 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73  olumnToReg(pPars
2fc40 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc60 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
2fc70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
2fc80 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b  ol->iTable, r1);
2fc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
2fca0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2fcb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fcc0 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
2fcd0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2fce0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2fcf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2fd00 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
2fd10 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
2fd20 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
2fd30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fd40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
2fd50 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67  rterInsert, sAgg
2fd60 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2fd70 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
2fd80 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
2fd90 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
2fda0 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
2fdb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
2fdc0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
2fdd0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
2fde0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2fdf0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2fe00 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
2fe10 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2fe20 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54  IdxPTab = sortPT
2fe30 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
2fe40 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72  b++;.        sor
2fe50 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65  tOut = sqlite3Ge
2fe60 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
2fe70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2fe80 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2fe90 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f  P_OpenPseudo, so
2fea0 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c  rtPTab, sortOut,
2feb0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
2fec0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fed0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
2fee0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
2fef0 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64  tingIdx, addrEnd
2ff00 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2ff10 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55  omment((v, "GROU
2ff20 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64  P BY sort")); Vd
2ff30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2ff40 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2ff50 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
2ff60 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
2ff70 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2ff80 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
2ff90 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
2ffa0 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d  the index or tem
2ffb0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65  porary table use
2ffc0 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42  d by the GROUP B
2ffd0 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20  Y sort.      ** 
2ffe0 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64  will naturally d
2fff0 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74  eliver rows in t
30000 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65  he order require
30010 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42  d by the ORDER B
30020 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  Y.      ** claus
30030 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70  e, cancel the ep
30040 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70  hemeral table op
30050 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  en coded earlier
30060 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
30070 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   ** This is an o
30080 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68  ptimization - th
30090 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
300a0 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72   should result r
300b0 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20  egardless..     
300c0 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49   ** Use the SQLI
300d0 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20  TE_GroupByOrder 
300e0 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45  flag with SQLITE
300f0 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
30100 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ZER to .      **
30110 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70   disable this op
30120 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
30130 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
30140 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
30150 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74  rderByGrp && Opt
30160 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
30170 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75  (db, SQLITE_Grou
30180 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20  pByOrder) .     
30190 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72    && (groupBySor
301a0 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72  t || sqlite3Wher
301b0 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f  eIsSorted(pWInfo
301c0 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  )).      ){.    
301d0 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
301e0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  By = 0;.        
301f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
30200 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
30210 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
30220 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
30230 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
30240 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
30250 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
30260 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
30270 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
30280 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
30290 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
302a0 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
302b0 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
302c0 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
302d0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
302e0 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
302f0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
30300 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
30310 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
30320 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
30330 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
30340 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
30350 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
30360 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
30370 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
30380 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
30390 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
303a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72  e);.      if( gr
303b0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
303c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
303d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
303e0 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66  terData, sAggInf
303f0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  o.sortingIdx,.  
30400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30410 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c          sortOut,
30420 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20   sortPTab);.    
30430 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
30440 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
30450 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
30460 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
30470 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
30480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30490 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
304a0 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42   sortPTab, j, iB
304b0 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
304c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
304d0 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
304e0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
304f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
30500 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
30510 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
30520 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
30530 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30550 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
30560 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
30570 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
30580 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
30590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
305a0 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
305b0 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
305c0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
305d0 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
305e0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
305f0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
30600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
30610 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
30620 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29  1+1, 0, addr1+1)
30630 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
30640 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
30650 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
30660 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
30670 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
30680 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
30690 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55  nges in the GROU
306a0 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
306b0 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
306c0 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
306d0 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
306e0 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
306f0 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
30700 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
30710 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
30720 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
30730 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
30740 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
30750 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
30760 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
30770 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
30780 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
30790 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
307a0 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
307b0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
307c0 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
307d0 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
307e0 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
307f0 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
30800 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
30810 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
30820 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d  ve(pParse, iBMem
30830 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iAMem, pGroupB
30840 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  y->nExpr);.     
30850 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30860 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
30870 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
30880 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
30890 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
308a0 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
308b0 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
308c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
308d0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
308e0 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
308f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
30900 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
30910 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
30920 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
30930 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30940 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
30950 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
30960 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
30970 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
30980 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61   "reset accumula
30990 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
309a0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
309b0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
309c0 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
309d0 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
309e0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
309f0 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
30a00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
30a10 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
30a20 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
30a30 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
30a40 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
30a50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30a60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
30a70 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61  eger, 1, iUseFla
30a80 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
30a90 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
30aa0 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
30ab0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
30ac0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
30ad0 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
30ae0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
30af0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
30b00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30b10 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
30b20 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
30b30 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
30b40 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  OfLoop);.       
30b50 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
30b60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
30b80 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
30b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30ba0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
30bb0 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
30bc0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
30bd0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
30be0 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
30bf0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
30c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30c10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
30c20 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
30c30 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
30c40 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
30c50 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
30c60 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
30c70 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
30c80 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
30c90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30ca0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
30cb0 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  v, addrEnd);..  
30cc0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
30cd0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
30ce0 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
30cf0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
30d00 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
30d10 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
30d20 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
30d30 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
30d40 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
30d50 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
30d60 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
30d70 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
30d80 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
30d90 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
30da0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
30db0 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
30dc0 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
30dd0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
30de0 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
30df0 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
30e00 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
30e10 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
30e20 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
30e30 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
30e40 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
30e50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
30e60 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
30e70 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
30e80 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
30e90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30ea0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
30eb0 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
30ec0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
30ed0 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
30ee0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
30ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30f00 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
30f10 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
30f20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30f30 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
30f40 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
30f50 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
30f60 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
30f70 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
30f80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30f90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
30fa0 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
30fb0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
30fc0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
30fd0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
30fe0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
30ff0 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
31000 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
31010 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
31020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
31030 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
31040 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
31050 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
31060 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
31070 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
31080 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
31090 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
310a0 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
310b0 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
310c0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
310d0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
310e0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
310f0 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f  pEList, -1, &sSo
31100 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
31110 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74            &sDist
31120 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
31130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31140 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
31150 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
31160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31170 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
31180 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
31190 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
311a0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
311b0 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
311c0 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
311d0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
311e0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
311f0 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
31200 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
31210 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
31220 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
31230 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
31240 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  v, addrReset);. 
31250 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
31260 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
31270 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
31280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31290 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
312a0 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20  regReset);.     
312b0 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
312c0 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e  pGroupBy.  Begin
312d0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
312e0 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50  es without GROUP
312f0 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65   BY: */.    else
31300 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
31310 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66  t *pDel = 0;.#if
31320 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31330 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
31340 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
31350 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d       if( (pTab =
31360 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70   isSimpleCount(p
31370 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30  , &sAggInfo))!=0
31380 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
31390 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  f isSimpleCount(
313a0 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  ) returns a poin
313b0 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73  ter to a Table s
313c0 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20  tructure, then. 
313d0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
313e0 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  L statement is o
313f0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20  f the form:.    
31400 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31410 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
31420 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20  (*) FROM <tbl>. 
31430 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31440 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54    ** where the T
31450 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72  able structure r
31460 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e  eturned represen
31470 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a  ts table <tbl>..
31480 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31490 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65     ** This state
314a0 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f  ment is so commo
314b0 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74  n that it is opt
314c0 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79  imized specially
314d0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
314e0 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75   OP_Count instru
314f0 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65  ction is execute
31500 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20  d either on the 
31510 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61  intkey table tha
31520 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
31530 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66  tains the data f
31540 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f  or table <tbl> o
31550 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20  r on one of its 
31560 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20  indexes. It.    
31570 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72      ** is better
31580 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
31590 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20  op on an index, 
315a0 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  as indexes are a
315b0 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  lmost.        **
315c0 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61   always spread a
315d0 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73  cross less pages
315e0 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72   than their corr
315f0 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73  esponding tables
31600 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
31610 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
31620 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
31630 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
31640 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
31650 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ema);.        co
31660 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70  nst int iCsr = p
31670 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
31680 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
31690 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20  scan b-tree */. 
316a0 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
316b0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
316c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
316d0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
316e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49   */.        KeyI
316f0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
31700 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
31710 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20   /* Keyinfo for 
31720 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f  scanned index */
31730 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
31740 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
31750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31760 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e   Best index foun
31770 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  d so far */.    
31780 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
31790 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20  pTab->tnum;     
317a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
317b0 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64   page of scanned
317c0 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
317d0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
317e0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
317f0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
31800 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
31810 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
31820 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
31830 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
31840 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
31850 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68  for the index th
31860 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73  at has the lowes
31870 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20  t scan cost..   
31880 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31890 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20  ** (2011-04-15) 
318a0 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c  Do not do a full
318b0 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72   scan of an unor
318c0 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20  dered index..   
318d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
318e0 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20  ** (2013-10-03) 
318f0 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65  Do not count the
31900 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61   entries in a pa
31910 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20  rtial index..   
31920 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31930 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74  ** In practice t
31940 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
31950 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ture will not be
31960 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c   used. It is onl
31970 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  y .        ** pa
31980 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f  ssed to keep OP_
31990 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a  OpenRead happy..
319a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
319b0 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
319c0 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d  (pTab) ) pBest =
319d0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
319e0 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
319f0 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
31a00 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
31a10 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
31a20 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
31a30 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
31a40 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
31a50 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49      && pIdx->szI
31a60 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
31a70 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20  bRow.           
31a80 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  && pIdx->pPartId
31a90 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20  xWhere==0.      
31aa0 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20       && (!pBest 
31ab0 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  || pIdx->szIdxRo
31ac0 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f  w<pBest->szIdxRo
31ad0 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  w).          ){.
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
31af0 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
31b00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31b10 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
31b20 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
31b30 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e  Root = pBest->tn
31b40 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b  um;.          pK
31b50 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
31b60 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
31b70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
31b80 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
31b90 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
31ba0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
31bb0 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
31bc0 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
31bd0 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
31be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31bf0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
31c00 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
31c10 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  t, iDb, 1);.    
31c20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
31c30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
31c40 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
31c50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
31c60 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
31c70 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
31c80 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
31c90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
31ca0 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73  P_Count, iCsr, s
31cb0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
31cc0 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
31cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31ce0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
31cf0 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  Csr);.        ex
31d00 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
31d10 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
31d20 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Best);.      }el
31d30 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
31d40 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
31d50 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
31d60 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
31d70 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
31d80 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
31d90 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
31da0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31db0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
31dc0 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
31dd0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
31de0 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
31df0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
31e00 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
31e10 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
31e20 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
31e30 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
31e40 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
31e50 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
31e60 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
31e70 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
31e80 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
31e90 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
31ea0 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
31eb0 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
31ec0 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
31ed0 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
31ee0 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
31ef0 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
31f00 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
31f10 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
31f20 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
31f30 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
31f40 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
31f50 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
31f60 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
31f70 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
31f80 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
31f90 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
31fa0 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
31fb0 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
31fc0 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
31fd0 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
31fe0 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
31ff0 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
32000 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
32010 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
32020 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
32030 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
32040 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
32050 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77  havior as follow
32060 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
32070 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
32080 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
32090 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
320a0 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
320b0 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ded by.        *
320c0 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
320d0 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
320e0 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
320f0 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
32100 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ue.        **   
32110 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20    for x..       
32120 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
32130 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72   + The optimizer
32140 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
32150 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74   (the thing that
32160 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20   decides which. 
32170 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
32180 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
32190 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
321a0 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
321b0 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
321c0 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
321d0 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
321e0 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
321f0 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
32200 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
32210 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
32220 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
32230 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
32240 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
32250 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45      */.        E
32260 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
32270 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
32280 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52   flag = WHERE_OR
32290 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
322a0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61        .        a
322b0 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
322c0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
322d0 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
322e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
322f0 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b  p->pHaving==0 ){
32300 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  .          flag 
32310 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73  = minMaxQuery(&s
32320 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61  AggInfo, &pMinMa
32330 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
32340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
32350 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61  ag==0 || (pMinMa
32360 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d  x!=0 && pMinMax-
32370 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20  >nExpr==1) );.. 
32380 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20         if( flag 
32390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
323a0 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
323b0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
323c0 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20  inMax, 0);.     
323d0 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
323e0 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Max;.          a
323f0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
32400 63 46 61 69 6c 65 64 20 7c 7c 20 70 4d 69 6e 4d  cFailed || pMinM
32410 61 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ax!=0 );.       
32420 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
32430 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
32440 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
32450 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
32460 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52  = flag!=WHERE_OR
32470 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a  DERBY_MIN ?1:0;.
32480 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
32490 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
324a0 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
324b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
324c0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
324d0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
324e0 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
324f0 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
32500 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
32510 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
32520 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
32530 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
32540 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
32550 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20  ngle row.       
32560 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
32570 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32580 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
32590 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
325a0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Info);.        p
325b0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
325c0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
325d0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
325e0 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c  re, pMinMax,0,fl
325f0 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ag,0);.        i
32600 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
32610 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32620 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
32630 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
32640 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
32650 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
32660 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
32670 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
32680 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
32690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
326a0 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e  inMax==0 || pMin
326b0 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  Max->nExpr==1 );
326c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
326d0 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
326e0 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a  ed(pWInfo)>0 ){.
326f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32700 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c  3VdbeGoto(v, sql
32710 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
32720 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20  bel(pWInfo));.  
32730 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
32740 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
32750 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
32760 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
32770 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
32780 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
32790 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
327a0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
327b0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
327c0 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
327d0 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
327e0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
327f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f      }..      sSo
32800 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
32810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
32820 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
32830 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
32840 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
32850 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
32860 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
32870 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
32880 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20  st, -1, 0, 0, . 
32890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328a0 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
328b0 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
328c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
328d0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
328e0 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
328f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
32900 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
32910 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
32920 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
32930 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
32940 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
32950 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
32960 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
32970 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
32980 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
32990 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
329a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
329b0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
329c0 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
329d0 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
329e0 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
329f0 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
32a00 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
32a10 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
32a20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
32a30 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
32a40 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a  mpTable(pParse,.
32a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a60 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
32a70 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
32a80 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
32a90 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
32aa0 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
32ab0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
32ac0 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
32ad0 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
32ae0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
32af0 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
32b00 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
32b10 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
32b20 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
32b30 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
32b40 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
32b50 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
32b60 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
32b70 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
32b80 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
32b90 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
32ba0 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
32bb0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
32bc0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
32bd0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
32be0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
32bf0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
32c00 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
32c10 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
32c20 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
32c30 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
32c40 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
32c50 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
32c60 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
32c70 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
32c80 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
32c90 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
32ca0 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
32cb0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
32cc0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
32cd0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
32ce0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
32cf0 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
32d00 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
32d10 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
32d20 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
32d30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
32d40 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
32d50 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
32d60 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
32d70 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45  aFunc);.#if SELE
32d80 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
32d90 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
32da0 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70  pParse,p,("end p
32db0 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
32dc0 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
32dd0 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
32de0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
32df0 0a                                               .