/ Hex Artifact Content
Login

Artifact d38163a76a0da425afd4a43f5dd0dc88fdbe0aa258c45f6a9cb44acf0a606bc5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  end(pParse, 0,. 
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50    sqlite3Expr(pP
1030: 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45  arse->db,TK_ASTE
1040: 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20  RISK,0));.  }.  
1050: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pNew->pEList = p
1060: 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f  EList;.  pNew->o
1070: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
1080: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
1090: 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e  = selFlags;.  pN
10a0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
10b0: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
10c0: 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  = 0;.#if SELECTT
10d0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70  RACE_ENABLED.  p
10e0: 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d  New->zSelName[0]
10f0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
1100: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
1110: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
1120: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
1130: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
1140: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
1150: 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29  .  if( pSrc==0 )
1160: 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44   pSrc = sqlite3D
1170: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
1180: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
1190: 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pSrc));.  pNew->
11a0: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
11b0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
11c0: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
11d0: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
11e0: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
11f0: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
1200: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1210: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
1220: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  w->pPrior = 0;. 
1230: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
1240: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
1250: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
1260: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
1270: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  fset;.  pNew->pW
1280: 69 74 68 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ith = 0;.  asser
1290: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
12a0: 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50   pLimit!=0 || pP
12b0: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 0a 20 20 20  arse->nErr>0.   
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
12e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
12f0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
1300: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1310: 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  ed ) {.    clear
1320: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64  Select(pParse->d
1330: 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26  b, pNew, pNew!=&
1340: 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e  standin);.    pN
1350: 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ew = 0;.  }else{
1360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
1370: 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50  w->pSrc!=0 || pP
1380: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a  arse->nErr>0 );.
1390: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
13a0: 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a  ew!=&standin );.
13b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
13c0: 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
13d0: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
13e0: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
13f0: 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a  a Select object.
1400: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1410: 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c  electSetName(Sel
1420: 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ect *p, const ch
1430: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
1440: 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a  ( p && zName ){.
1450: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1460: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a  intf(sizeof(p->z
1470: 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65  SelName), p->zSe
1480: 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61  lName, "%s", zNa
1490: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  me);.  }.}.#endi
14a0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  f.../*.** Delete
14b0: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
14c0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
14d0: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
14e0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
14f0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1500: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1510: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1520: 20 69 66 28 20 70 20 29 20 63 6c 65 61 72 53 65   if( p ) clearSe
1530: 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a  lect(db, p, 1);.
1540: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1550: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1560: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
1570: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1580: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
1590: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
15a0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
15b0: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
15c0: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
15d0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
15e0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
15f0: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1600: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1610: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1620: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1630: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1640: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
1650: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
1660: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
1670: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
1680: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
1690: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
16a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
16b0: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
16c0: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
16d0: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
16e0: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
16f0: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1700: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1710: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1720: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1730: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1740: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
1750: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
1760: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1770: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
1780: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
1790: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
17a0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
17b0: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
17c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
17d0: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
17e0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
17f0: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1800: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1810: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1820: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1830: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1840: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
1870: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
1880: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
1890: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
18a0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
18b0: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
18c0: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
18d0: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
18e0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
18f0: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1900: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1910: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1920: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1930: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1940: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
1950: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
1960: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
1970: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
1980: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
1990: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
19a0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
19b0: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
19c0: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
19e0: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
19f0: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1a00: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1a10: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1a20: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1a30: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
1a50: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
1a60: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
1a70: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
1a80: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
1a90: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
1aa0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1ab0: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1ac0: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1af0: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1b00: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1b10: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1b20: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1b30: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1b40: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
1b50: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
1b60: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
1b70: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
1b80: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
1b90: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
1ba0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1bb0: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1bc0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1bd0: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1be0: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1bf0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1c00: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1c10: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1c20: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1c30: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1c40: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1c50: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
1c60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c80: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1c90: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
1ca0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1cb0: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1cc0: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1cd0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1ce0: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1cf0: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1d00: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1d10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1d20: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1d30: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1d40: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
1d50: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
1d60: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
1d70: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
1d80: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d90: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
1da0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1db0: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1dc0: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1dd0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1de0: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1df0: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1e00: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1e10: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1e20: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1e30: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1e40: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1e50: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1e60: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1e70: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1e80: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1e90: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1ea0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1eb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ec0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1ed0: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1ee0: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1ef0: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1f00: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1f10: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1f20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1f30: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1f40: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1f50: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1f60: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1f70: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1f80: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1f90: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1fa0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1fb0: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1fc0: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1fd0: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1fe0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1ff0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
2000: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
2010: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
2020: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
2030: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
2040: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
2050: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
2060: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
2070: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
2080: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
2090: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
20a0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
20b0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
20c0: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
20d0: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
20e0: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
20f0: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
2100: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
2110: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
2120: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
2130: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
2140: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
2150: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
2160: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
2170: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
2180: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
2190: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
21a0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
21b0: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
21c0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
21d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21e0: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
21f0: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
2200: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
2210: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
2220: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
2230: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
2240: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
2250: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
2260: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
2270: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
2280: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
2290: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
22a0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
22b0: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
22c0: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
22d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2300: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
2310: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2330: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
2340: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
2350: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
2360: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
2370: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
2380: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
2390: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
23a0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
23b0: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
23c0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
23d0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
23e0: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
23f0: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2400: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2410: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2420: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2430: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2450: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2460: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2470: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
2480: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
2490: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
24a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
24b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
24c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24d0: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
24e0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
24f0: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2500: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2510: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2520: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2530: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2540: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
2550: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
2560: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
2570: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
2580: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
2590: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
25a0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
25b0: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
25c0: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
25d0: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
25e0: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
25f0: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2600: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2610: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2630: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2640: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2660: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
2670: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
2680: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
2690: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
26a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
26b0: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
26c0: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
26d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
26e0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
26f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2700: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2710: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2720: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2740: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
2750: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
2760: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
2770: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2780: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
2790: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
27a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
27b0: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
27c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27d0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
27e0: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
27f0: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2820: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2830: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2840: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2850: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
2860: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
2870: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
2880: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
2890: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
28a0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
28b0: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
28c0: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
28d0: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
28e0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
28f0: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2900: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2910: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2920: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2930: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2940: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2950: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2960: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
2970: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
2980: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2990: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
29a0: 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70 45  , pE2);.  if( pE
29b0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
29c0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
29d0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
29e0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
29f0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2a20: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
2a30: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2a40: 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  pEq, EP_NoReduce
2a50: 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67  );.    pEq->iRig
2a60: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
2a70: 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a  16)pE2->iTable;.
2a80: 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d    }.  *ppWhere =
2a90: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2aa0: 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45  db, *ppWhere, pE
2ab0: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  q);.}../*.** Set
2ac0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
2ad0: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
2ae0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
2af0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
2b00: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
2b10: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
2b20: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
2b30: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
2b40: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2b50: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
2b60: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2b70: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
2b80: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
2b90: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
2ba0: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
2bb0: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
2bc0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
2bd0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
2be0: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
2bf0: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
2c00: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2c10: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
2c20: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
2c30: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2c40: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
2c50: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
2c60: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
2c70: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2c80: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
2c90: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
2ca0: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
2cb0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
2cc0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
2cd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2ce0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
2cf0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
2d00: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
2d10: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2d20: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
2d30: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
2d40: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
2d50: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
2d60: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
2d70: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
2d80: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
2d90: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
2da0: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
2db0: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
2dc0: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
2dd0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2de0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
2df0: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
2e00: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
2e10: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
2e20: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
2e30: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
2e40: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
2e50: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
2e60: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
2e70: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
2e80: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
2e90: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
2ea0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2eb0: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
2ec0: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
2ed0: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
2ee0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
2ef0: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
2f00: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
2f10: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
2f20: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
2f30: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
2f40: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
2f50: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
2f60: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
2f70: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
2f80: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
2f90: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
2fa0: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
2fb0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
2fc0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
2fd0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2fe0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2ff0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
3000: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
3010: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
3020: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c  etVVAProperty(p,
3030: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
3040: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
3050: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61  Table = (i16)iTa
3060: 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ble;.    if( p->
3070: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
3080: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  && p->x.pList ){
3090: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
30a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
30b0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
30c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30d0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
30e0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
30f0: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
3100: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
3110: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
3120: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
3130: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
3140: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
3150: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
3160: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
3170: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
3180: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3190: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
31a0: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
31b0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
31c0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
31d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
31e0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
31f0: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
3200: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
3210: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  erms..**.** The 
3220: 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20  terms of a FROM 
3230: 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61  clause are conta
3240: 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65  ined in the Sele
3250: 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72  ct.pSrc structur
3260: 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d  e..** The left m
3270: 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65  ost table is the
3280: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
3290: 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68  Select.pSrc.  Th
32a0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20  e right-most.** 
32b0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73  table is the las
32c0: 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f  t entry.  The jo
32d0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68  in operator is h
32e0: 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79  eld in the entry
32f0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e   to.** the left.
3300: 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63    Thus entry 0 c
3310: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e  ontains the join
3320: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68   operator for th
3330: 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a  e join between.*
3340: 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20  * entries 0 and 
3350: 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53  1.  Any ON or US
3360: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f  ING clauses asso
3370: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3380: 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f  join are.** also
3390: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
33a0: 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a   left entry..**.
33b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
33c0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
33d0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
33e0: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  ountered..*/.sta
33f0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72  tic int sqlitePr
3400: 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20  ocessJoin(Parse 
3410: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
3420: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
3430: 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  pSrc;           
3440: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61         /* All ta
3450: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
3460: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
3470: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3490: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
34a0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34b0: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20  t_item *pLeft;  
34c0: 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65     /* Left table
34d0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
34e0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34f0: 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20  t_item *pRight; 
3500: 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c     /* Right tabl
3510: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
3520: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  /..  pSrc = p->p
3530: 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26  Src;.  pLeft = &
3540: 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52  pSrc->a[0];.  pR
3550: 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d  ight = &pLeft[1]
3560: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3570: 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b  Src->nSrc-1; i++
3580: 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66  , pRight++, pLef
3590: 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  t++){.    Table 
35a0: 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66  *pLeftTab = pLef
35b0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62  t->pTab;.    Tab
35c0: 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20  le *pRightTab = 
35d0: 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20  pRight->pTab;.  
35e0: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a    int isOuter;..
35f0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c      if( NEVER(pL
3600: 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  eftTab==0 || pRi
3610: 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e  ghtTab==0) ) con
3620: 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74  tinue;.    isOut
3630: 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 66 67  er = (pRight->fg
3640: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
3650: 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f  UTER)!=0;..    /
3660: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
3670: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
3680: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
3690: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
36a0: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
36b0: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
36c0: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
36d0: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
36e0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
36f0: 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
3700: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
3710: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3720: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
3730: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
3740: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3750: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
3760: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
3770: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
3780: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
3790: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
37a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
37b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
37c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
37d0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
37e0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
37f0: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
3800: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
3810: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
3820: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3830: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
3840: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
3850: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3860: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
3870: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
3880: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
3890: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
38a0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
38b0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
38c0: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
38d0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
38e0: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
38f0: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
3900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
3910: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
3920: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
3930: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
3940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3950: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
3960: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
3970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3980: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
3990: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
39a0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
39b0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
39c0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
39d0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
39e0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
39f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3a00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3a10: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
3a20: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
3a30: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
3a40: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
3a50: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
3a60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
3a70: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
3a80: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
3a90: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
3aa0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
3ab0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3ac0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3ad0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3ae0: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3af0: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3b00: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3b10: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3b20: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3b30: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3b40: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3b50: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
3b60: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
3b70: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
3b80: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
3b90: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
3ba0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
3bb0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3bc0: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3bd0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3be0: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3bf0: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3c00: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3c10: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3c20: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3c30: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3c40: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3c50: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
3c60: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
3c70: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
3c80: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
3c90: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
3ca0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
3cb0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3cc0: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3cd0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3ce0: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3cf0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3d00: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3d10: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3d20: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3d30: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3d40: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3d50: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
3d60: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
3d70: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
3d80: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3d90: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
3da0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
3db0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3dc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3dd0: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3de0: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3df0: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3e00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3e10: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3e20: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3e30: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3e40: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3e50: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
3e60: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
3e70: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
3e80: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
3e90: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
3ea0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
3eb0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3ec0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3ed0: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3ee0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3ef0: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3f00: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3f10: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3f20: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3f30: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3f40: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3f50: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
3f60: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
3f70: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3f80: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
3f90: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
3fa0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
3fb0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3fc0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3fd0: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3fe0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3ff0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
4000: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
4010: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
4020: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
4030: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
4040: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
4050: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
4060: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
4070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4080: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4090: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
40a0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
40b0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
40c0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
40d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
40e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
40f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4100: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
4110: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
4120: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
4130: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
4140: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
4150: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
4160: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
4170: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
4180: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
4190: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
41a0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
41b0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
41c0: 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  d */.);../*.** G
41d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
41e0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
41f0: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4200: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4210: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4220: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4230: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4240: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4250: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4260: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4270: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4280: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4290: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
42a0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
42b0: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
42c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
42d0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
42e0: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
42f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4300: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4310: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4320: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4330: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4340: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4350: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4360: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4370: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4380: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4390: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
43a0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
43b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
43c0: 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
43d0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
43e0: 6e 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20  nPrefixReg      
43f0: 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67     /* No. of reg
4400: 20 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74   prior to regDat
4410: 61 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  a available for 
4420: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  use */.){.  Vdbe
4430: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
4440: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4460: 53 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  Stmt under const
4470: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
4480: 20 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d   bSeq = ((pSort-
4490: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
44a0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
44b0: 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ==0);.  int nExp
44c0: 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  r = pSort->pOrde
44d0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20  rBy->nExpr;     
44e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
44f0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
4500: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65  s */.  int nBase
4510: 20 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20   = nExpr + bSeq 
4520: 2b 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  + nData;        
4530: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64          /* Field
4540: 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f  s in sorter reco
4550: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  rd */.  int regB
4560: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73           /* Regs
4590: 20 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f   for sorter reco
45a0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  rd */.  int regR
45b0: 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65  ecord = ++pParse
45c0: 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
45d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65           /* Asse
45e0: 6d 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63  mbled sorter rec
45f0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42  ord */.  int nOB
4600: 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42  Sat = pSort->nOB
4610: 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sat;            
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44            /* ORD
4630: 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73  ER BY terms to s
4640: 6b 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  kip */.  int op;
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4670: 70 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72  pcode to add sor
4680: 74 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f  ter record to so
4690: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rter */.  int iL
46a0: 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
46c0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f  LIMIT counter */
46d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71  ..  assert( bSeq
46e0: 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29  ==0 || bSeq==1 )
46f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74  ;.  assert( nDat
4700: 61 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d  a==1 || regData=
4710: 3d 72 65 67 4f 72 69 67 44 61 74 61 20 7c 7c 20  =regOrigData || 
4720: 72 65 67 4f 72 69 67 44 61 74 61 3d 3d 30 20 29  regOrigData==0 )
4730: 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  ;.  if( nPrefixR
4740: 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  eg ){.    assert
4750: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45  ( nPrefixReg==nE
4760: 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20  xpr+bSeq );.    
4770: 72 65 67 42 61 73 65 20 3d 20 72 65 67 44 61 74  regBase = regDat
4780: 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53 65 71  a - nExpr - bSeq
4790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
47a0: 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
47b0: 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70  >nMem + 1;.    p
47c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
47d0: 42 61 73 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Base;.  }.  asse
47e0: 72 74 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  rt( pSelect->iOf
47f0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65  fset==0 || pSele
4800: 63 74 2d 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b  ct->iLimit!=0 );
4810: 0a 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c  .  iLimit = pSel
4820: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  ect->iOffset ? p
4830: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
4840: 31 20 3a 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  1 : pSelect->iLi
4850: 6d 69 74 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61  mit;.  pSort->la
4860: 62 65 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  belDone = sqlite
4870: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
4880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4890: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
48a0: 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64  rse, pSort->pOrd
48b0: 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 72  erBy, regBase, r
48c0: 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20 20  egOrigData,.    
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
48f0: 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69 67  L_DUP | (regOrig
4900: 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43 45  Data? SQLITE_ECE
4910: 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20 69  L_REF : 0));.  i
4920: 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73  f( bSeq ){.    s
4930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4940: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
4950: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4960: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4970: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65  ;.  }.  if( nPre
4980: 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44 61  fixReg==0 && nDa
4990: 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ta>0 ){.    sqli
49a0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
49b0: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
49c0: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 62   regBase+nExpr+b
49d0: 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d  Seq, nData);.  }
49e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
49f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4a00: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e  ecord, regBase+n
4a10: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
4a20: 53 61 74 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Sat, regRecord);
4a30: 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30 20  .  if( nOBSat>0 
4a40: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50 72  ){.    int regPr
4a50: 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20  evKey;   /* The 
4a60: 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c  first nOBSat col
4a70: 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65 76  umns of the prev
4a80: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
4a90: 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20  int addrFirst;  
4aa0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
4ab0: 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63  the OP_IfNot opc
4ac0: 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ode */.    int a
4ad0: 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20  ddrJmp;      /* 
4ae0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
4af0: 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f  P_Jump opcode */
4b00: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
4b10: 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  ;      /* Opcode
4b20: 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65 20   that opens the 
4b30: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
4b40: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
4b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72  /* Number of sor
4b60: 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  ting key columns
4b70: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53  , including OP_S
4b80: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b  equence */.    K
4b90: 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20  eyInfo *pKI;    
4ba0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79   /* Original Key
4bb0: 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74  Info on the sort
4bc0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  er table */..   
4bd0: 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50   regPrevKey = pP
4be0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
4bf0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4c00: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
4c10: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70  .    nKey = nExp
4c20: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r - pSort->nOBSa
4c30: 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66  t + bSeq;.    if
4c40: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ( bSeq ){.      
4c50: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
4c60: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4c70: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61   OP_IfNot, regBa
4c80: 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20  se+nExpr); .    
4c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
4ca0: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4cb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4cc0: 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70  _SequenceTest, p
4cd0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43  .    }.    VdbeC
4cf0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d10: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
4d20: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67   regPrevKey, reg
4d30: 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  Base, pSort->nOB
4d40: 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20  Sat);.    pOp = 
4d50: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
4d60: 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53  (v, pSort->addrS
4d70: 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  ortIndex);.    i
4d80: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
4d90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
4da0: 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  turn;.    pOp->p
4db0: 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61  2 = nKey + nData
4dc0: 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d  ;.    pKI = pOp-
4dd0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
4de0: 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53    memset(pKI->aS
4df0: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49  ortOrder, 0, pKI
4e00: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a  ->nKeyField); /*
4e10: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74   Makes OP_Jump t
4e20: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4e30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4e40: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4e50: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4e60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4e70: 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20   pKI->nAllField 
4e80: 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  > pKI->nKeyField
4e90: 2b 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  +2 );.    pOp->p
4ea0: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79  4.pKeyInfo = key
4eb0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
4ec0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
4ed0: 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74  pOrderBy, nOBSat
4ee0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
4f10: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
4f20: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
4f30: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
4f40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4f50: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
4f60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4f70: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
4f80: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
4f90: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
4fa0: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
4fb0: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
4fc0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4fd0: 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  l(v);.    pSort-
4fe0: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
4ff0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5010: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
5020: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
5030: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
5040: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
5050: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5060: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
5070: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
5080: 0a 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20  .    if( iLimit 
5090: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
50a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
50b0: 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
50c0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65  pSort->labelDone
50d0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
50e0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
50f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5100: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46  umpHere(v, addrF
5110: 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  irst);.    sqlit
5120: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
5130: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
5140: 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72  regPrevKey, pSor
5150: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
5160: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5170: 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b  ere(v, addrJmp);
5180: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
5190: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
51a0: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
51b0: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f   ){.    op = OP_
51c0: 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20  SorterInsert;.  
51d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
51e0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20  OP_IdxInsert;.  
51f0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
5200: 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
5210: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
5220: 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20   regRecord,.    
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61     regBase+nOBSa
5250: 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29  t, nBase-nOBSat)
5260: 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29  ;.  if( iLimit )
5270: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
5280: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 30 3b 0a      int r1 = 0;.
5290: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
52a0: 73 6f 72 74 65 72 20 75 6e 74 69 6c 20 69 74 20  sorter until it 
52b0: 63 6f 6e 74 61 69 6e 73 20 4c 49 4d 49 54 2b 4f  contains LIMIT+O
52c0: 46 46 53 45 54 20 65 6e 74 72 69 65 73 2e 20 20  FFSET entries.  
52d0: 28 54 68 65 20 69 4c 69 6d 69 74 0a 20 20 20 20  (The iLimit.    
52e0: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 73 20 69  ** register is i
52f0: 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74 68 20  nitialized with 
5300: 76 61 6c 75 65 20 6f 66 20 4c 49 4d 49 54 2b 4f  value of LIMIT+O
5310: 46 46 53 45 54 2e 29 20 20 41 66 74 65 72 20 74  FFSET.)  After t
5320: 68 65 20 73 6f 72 74 65 72 0a 20 20 20 20 2a 2a  he sorter.    **
5330: 20 66 69 6c 6c 73 20 75 70 2c 20 64 65 6c 65 74   fills up, delet
5340: 65 20 74 68 65 20 6c 65 61 73 74 20 65 6e 74 72  e the least entr
5350: 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20  y in the sorter 
5360: 61 66 74 65 72 20 65 61 63 68 20 69 6e 73 65 72  after each inser
5370: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 75 73 20 77  t..    ** Thus w
5380: 65 20 6e 65 76 65 72 20 68 6f 6c 64 20 6d 6f 72  e never hold mor
5390: 65 20 74 68 61 6e 20 74 68 65 20 4c 49 4d 49 54  e than the LIMIT
53a0: 2b 4f 46 46 53 45 54 20 72 6f 77 73 20 69 6e 20  +OFFSET rows in 
53b0: 6d 65 6d 6f 72 79 20 61 74 20 6f 6e 63 65 20 2a  memory at once *
53c0: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  /.    addr = sql
53d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
53e0: 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  , OP_IfNotZero, 
53f0: 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
5400: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5420: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72  v, OP_Last, pSor
5430: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
5440: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72    if( pSort->bOr
5450: 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29  deredInnerLoop )
5460: 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 2b 2b 70  {.      r1 = ++p
5470: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5490: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
54a0: 6e 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  n, pSort->iECurs
54b0: 6f 72 2c 20 6e 45 78 70 72 2c 20 72 31 29 3b 0a  or, nExpr, r1);.
54c0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
54d0: 74 28 28 76 2c 20 22 73 65 71 22 29 29 3b 0a 20  t((v, "seq"));. 
54e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
54f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5500: 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e  _Delete, pSort->
5510: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  iECursor);.    i
5520: 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72  f( pSort->bOrder
5530: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
5540: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
5550: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 64 72 69  nner loop is dri
5560: 76 65 6e 20 62 79 20 61 6e 20 69 6e 64 65 78 20  ven by an index 
5570: 73 75 63 68 20 74 68 61 74 20 76 61 6c 75 65 73  such that values
5580: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74   from.      ** t
5590: 68 65 20 73 61 6d 65 20 69 74 65 72 61 74 69 6f  he same iteratio
55a0: 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  n of the inner l
55b0: 6f 6f 70 20 61 72 65 20 69 6e 20 73 6f 72 74 65  oop are in sorte
55c0: 64 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  d order, then.  
55d0: 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
55e0: 6c 79 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  ly jump to the n
55f0: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
5600: 20 61 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69   an inner loop i
5610: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  f the.      ** e
5620: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 63 75  ntry from the cu
5630: 72 72 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  rrent iteration 
5640: 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 69 6e 74  does not fit int
5650: 6f 20 74 68 65 20 74 6f 70 0a 20 20 20 20 20 20  o the top.      
5660: 2a 2a 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  ** LIMIT+OFFSET 
5670: 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73  entries of the s
5680: 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  orter. */.      
5690: 69 6e 74 20 69 42 72 6b 20 3d 20 73 71 6c 69 74  int iBrk = sqlit
56a0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
56b0: 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20  r(v) + 2;.      
56c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56d0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 42  3(v, OP_Eq, regB
56e0: 61 73 65 2b 6e 45 78 70 72 2c 20 69 42 72 6b 2c  ase+nExpr, iBrk,
56f0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
5700: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5710: 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
5720: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5730: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
5740: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5750: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
5760: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
5770: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
5780: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
5790: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
57a0: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
57b0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
57c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
57d0: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
57e0: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
57f0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5800: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
5810: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
5820: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
5830: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
5840: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
5850: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
5860: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
5870: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5880: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5890: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69  fPos, iOffset, i
58a0: 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64  Continue, 1); Vd
58b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
58c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
58d0: 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20  v, "OFFSET"));. 
58e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
58f0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
5900: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5910: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
5920: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
5930: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
5940: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
5950: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
5960: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
5970: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
5980: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
5990: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
59a0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
59b0: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
59c0: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
59d0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
59e0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
59f0: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
5a00: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
5a10: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
5a20: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
5a30: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
5a40: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
5a50: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
5a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
5a70: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
5a80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5a90: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5aa0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5ab0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
5ac0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
5ad0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
5ae0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
5af0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
5b00: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
5b10: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
5b20: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
5b30: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
5b40: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
5b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
5b60: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
5b70: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
5b80: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
5b90: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
5ba0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
5bb0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5bc0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
5bd0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5be0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5bf0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
5c00: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
5c10: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
5c20: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5c30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5c40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5c50: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
5c60: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
5c70: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5c80: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
5c90: 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e  Tab, r1, iMem, N
5ca0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5cb0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5cc0: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
5cd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
5ce0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5cf0: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
5d00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
5d10: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
5d20: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
5d30: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
5d40: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
5d50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
5d60: 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  b is negative, t
5d70: 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  hen the p->pELis
5d80: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
5d90: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
5da0: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
5db0: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5dc0: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
5dd0: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
5de0: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
5df0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
5e00: 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c 69  cTab and p->pELi
5e10: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
5e20: 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 6e  .** to get the n
5e30: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5e40: 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74 69   and the collati
5e50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
5e60: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
5e70: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
5e80: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
5e90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5ea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
5eb0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5ec0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
5ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5ee0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
5ef0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5f00: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
5f10: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5f20: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5f30: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5f40: 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   if non-negative
5f50: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5f60: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5f70: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5f80: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5f90: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5fa0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5fb0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5fc0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5fd0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5fe0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5ff0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
6000: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
6010: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
6020: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
6030: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
6040: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
6050: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
6060: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
6070: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
6080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
6090: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
60a0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
60b0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
60c0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
60d0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
60e0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
60f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
6100: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
6110: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
6120: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6130: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6140: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
6150: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
6160: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6170: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6180: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
6190: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
61a0: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
61b0: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
61c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
61d0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
61e0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
61f0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
6200: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
6210: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
6220: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
6230: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 2f  egResult */..  /
6240: 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65  * Usually, regRe
6250: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
6260: 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  t cell in an arr
6270: 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  ay of memory cel
6280: 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  ls.  ** containi
6290: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ng the current r
62a0: 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68  esult row. In th
62b0: 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67 20  is case regOrig 
62c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
62d0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48  ** same value. H
62e0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 72  owever, if the r
62f0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
6300: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72   sent to the sor
6310: 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61  ter, the.  ** va
6320: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70  lues for any exp
6330: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
6340: 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74  e also part of t
6350: 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20  he sort-key are 
6360: 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f  omitted.  ** fro
6370: 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e  m this array. In
6380: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
6390: 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ig is set to zer
63a0: 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  o.  */.  int reg
63b0: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
63c0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
63d0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
63e0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20  current results 
63f0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
6400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6410: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
6420: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c  ory holding full
6430: 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a   result (or 0) *
6440: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
6450: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
6460: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61  EList!=0 );.  ha
6470: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73  sDistinct = pDis
6480: 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63  tinct ? pDistinc
6490: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57  t->eTnctType : W
64a0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
64b0: 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20  OP;.  if( pSort 
64c0: 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  && pSort->pOrder
64d0: 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20  By==0 ) pSort = 
64e0: 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  0;.  if( pSort==
64f0: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
6500: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
6510: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b   iContinue!=0 );
6520: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
6530: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
6540: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a  Continue);.  }..
6550: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
6560: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
6570: 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43  .  */.  nResultC
6580: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
6590: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
65a0: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
65b0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
65c0: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
65d0: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
65e0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
65f0: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
6600: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6610: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6620: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6630: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6640: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
6650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
6660: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
6670: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
6680: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
6690: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
66a0: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
66b0: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
66c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
66d0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
66e0: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
66f0: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
6700: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6710: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6720: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6730: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6740: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
6750: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
6760: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
6770: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
6780: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
6790: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
67a0: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
67b0: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
67c0: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
67d0: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
67e0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
67f0: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
6800: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6810: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6820: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6830: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
6840: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
6850: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6860: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
6870: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
6880: 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d 20  ol;.  regOrig = 
6890: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73  regResult = pDes
68a0: 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20  t->iSdst;.  if( 
68b0: 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20  srcTab>=0 ){.   
68c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
68d0: 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ultCol; i++){.  
68e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
68f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
6900: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72  mn, srcTab, i, r
6910: 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20  egResult+i);.   
6920: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
6930: 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c 69  v, "%s", p->pELi
6940: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29  st->a[i].zName))
6950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
6960: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  if( eDest!=SRT_E
6970: 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20  xists ){.    /* 
6980: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
6990: 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28  on is an EXISTS(
69a0: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c  ...) expression,
69b0: 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20   the actual.    
69c0: 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  ** values return
69d0: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
69e0: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
69f0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38  d..    */.    u8
6a00: 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20   ecelFlags;.    
6a10: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
6a20: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
6a30: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
6a40: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6a50: 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  ){.      ecelFla
6a60: 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs = SQLITE_ECEL
6a70: 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _DUP;.    }else{
6a80: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
6a90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
6aa0: 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61 73  if( pSort && has
6ab0: 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65  Distinct==0 && e
6ac0: 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54  Dest!=SRT_EphemT
6ad0: 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  ab && eDest!=SRT
6ae0: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
6af0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  /* For each expr
6b00: 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c  ession in p->pEL
6b10: 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63 6f  ist that is a co
6b20: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
6b30: 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ion in.      ** 
6b40: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6b50: 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64  use (pSort->pOrd
6b60: 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20 61  erBy), set the a
6b70: 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20  ssociated .     
6b80: 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20   ** iOrderByCol 
6b90: 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72  value to one mor
6ba0: 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78  e than the index
6bb0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
6bc0: 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65   .      ** expre
6bd0: 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
6be0: 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70   sort-key that p
6bf0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
6c00: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
6c10: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c       ** This all
6c20: 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  ows the p->pELis
6c30: 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d  t field to be om
6c40: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
6c50: 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20  orted record,.  
6c60: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70      ** saving sp
6c70: 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c  ace and CPU cycl
6c80: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63  es.  */.      ec
6c90: 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  elFlags |= (SQLI
6ca0: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c  TE_ECEL_OMITREF|
6cb0: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
6cc0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
6cd0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70  ort->nOBSat; i<p
6ce0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
6cf0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
6d00: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
6d10: 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53 6f      if( (j = pSo
6d20: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b  rt->pOrderBy->a[
6d30: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
6d40: 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ol)>0 ){.       
6d50: 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b     p->pEList->a[
6d60: 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  j-1].u.x.iOrderB
6d70: 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74  yCol = i+1-pSort
6d80: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20  ->nOBSat;.      
6d90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6da0: 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20    regOrig = 0;. 
6db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
6dc0: 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65  st==SRT_Set || e
6dd0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20  Dest==SRT_Mem . 
6de0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65            || eDe
6df0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6e00: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
6e10: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a  Output );.    }.
6e20: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
6e30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6e40: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
6e50: 70 2d 3e 70 45 4c 69 73 74 2c 72 65 67 52 65 73  p->pEList,regRes
6e60: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
6e90: 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  ecelFlags);.  }.
6ea0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
6eb0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
6ec0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
6ed0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6ee0: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
6ef0: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
6f00: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
6f10: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
6f20: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
6f30: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
6f40: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
6f50: 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63  nct ){.    switc
6f60: 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  h( pDistinct->eT
6f70: 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20  nctType ){.     
6f80: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
6f90: 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
6fa0: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
6fb0: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
6fc0: 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  /* No longer req
6fd0: 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65  uired OpenEpheme
6fe0: 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20  ral instr. */.  
6ff0: 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7010: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
7020: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
7030: 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
7040: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
7050: 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   row content */.
7060: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  .        /* Allo
7070: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
7080: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
7090: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72  */.        regPr
70a0: 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
70b0: 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  m+1;.        pPa
70c0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
70d0: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  sultCol;..      
70e0: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
70f0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
7100: 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74   coded earlier t
7110: 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20  o an OP_Null.   
7120: 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65       ** sets the
7130: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74   MEM_Cleared bit
7140: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65   on the first re
7150: 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20  gister of the.  
7160: 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
7170: 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77  s value.  This w
7180: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50  ill cause the OP
7190: 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77  _Ne below to alw
71a0: 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ays.        ** f
71b0: 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ail on the first
71c0: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
71d0: 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74  e loop even if t
71e0: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
71f0: 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e   ** row is all N
7200: 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ULLs..        */
7210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7220: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
7230: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
7240: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
7250: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
7260: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73  dbeGetOp(v, pDis
7270: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
7280: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ;.        pOp->o
7290: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
72a0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
72b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 1;.        pO
72c0: 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b  p->p2 = regPrev;
72d0: 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20  ..        iJump 
72e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
72f0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52  rentAddr(v) + nR
7300: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20  esultCol;.      
7310: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
7320: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
7330: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
7340: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
7350: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
7360: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
7370: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
7380: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65         if( i<nRe
7390: 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  sultCol-1 ){.   
73a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
73b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
73c0: 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Ne, regResult+i
73d0: 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76  , iJump, regPrev
73e0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
73f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7400: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7410: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
7420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7430: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65  (v, OP_Eq, regRe
7440: 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75  sult+i, iContinu
7450: 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  e, regPrev+i);. 
7460: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
7470: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7490: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
74a0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
74b0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
74c0: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
74d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
74e0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
74f0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
7500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7520: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
7530: 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70  r(v)==iJump || p
7540: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
7550: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
7560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7570: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
7580: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
7590: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
75a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
75b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
75c0: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
75d0: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
75e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
75f0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
7600: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7610: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
7620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7630: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
7640: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7650: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
7660: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
7670: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
7680: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
7690: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
76a0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
76b0: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
76c0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
76f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7700: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7710: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
7720: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
7730: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
7740: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
7750: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
7760: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
7770: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
7780: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
7790: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
77a0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
77b0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
77c0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
77d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
77e0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
77f0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
7800: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
7810: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
7820: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7830: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7850: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
7860: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
7870: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
7880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7890: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
78a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
78b0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
78c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
78d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
78e0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
78f0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
7900: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
7910: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
7920: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
7930: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
7940: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
7950: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
7960: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
7970: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
7980: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
7990: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
79a0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
79b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
79c0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
79d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
79e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
79f0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
7a00: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7a10: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  tCol);.      bre
7a20: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
7a30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7a40: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
7a50: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  */..    /* Store
7a60: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
7a70: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
7a80: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
7a90: 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f     case SRT_Fifo
7aa0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
7ab0: 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  istFifo:.    cas
7ac0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
7ad0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
7ae0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
7af0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7b00: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
7b10: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
7b20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7b30: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
7b40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7b50: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
7b60: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
7b70: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7b80: 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  ==SRT_Fifo );.  
7b90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ba0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
7bb0: 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  o );.      sqlit
7bc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
7be0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7bf0: 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78  tCol, r1+nPrefix
7c00: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
7c10: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7c20: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
7c30: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20  RT_DistFifo ){. 
7c40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
7c50: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
7c60: 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63  DistFifo, then c
7c70: 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20  ursor (iParm+1) 
7c80: 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  is open.        
7c90: 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72  ** on an ephemer
7ca0: 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  al index. If the
7cb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
7cc0: 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a  already present.
7cd0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
7ce0: 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20  e index, do not 
7cf0: 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
7d00: 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20  output. If not, 
7d10: 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  add the.        
7d20: 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74  ** current row t
7d30: 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  o the index and 
7d40: 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69  proceed with wri
7d50: 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20  ting it to the. 
7d60: 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
7d70: 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20   table as well. 
7d80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7d90: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
7da0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
7db0: 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71   + 4;.        sq
7dc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
7dd0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
7de0: 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72  iParm+1, addr, r
7df0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 0);.        V
7e00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7e20: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
7e30: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
7e40: 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73  arm+1, r1,regRes
7e50: 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  ult,nResultCol);
7e60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7e70: 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20   pSort==0 );.   
7e80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7e90: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
7ea0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
7eb0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
7ec0: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
7ed0: 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c  ixReg,regResult,
7ee0: 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  1,nPrefixReg);. 
7ef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7f00: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
7f10: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
7f20: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
7f30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7f40: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7f50: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
7f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7f80: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
7f90: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
7fa0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7fb0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
7fc0: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
7fd0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7fe0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
7ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8000: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8010: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
8020: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
8030: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8040: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
8050: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
8060: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
8070: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
8080: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
8090: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
80a0: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
80b0: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
80c0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
80d0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
80e0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
80f0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
8100: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
8110: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
8120: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8130: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
8140: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
8150: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
8160: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
8170: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
8180: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
8190: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
81a0: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
81b0: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
81c0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
81d0: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
81e0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
81f0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
8200: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
8210: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
8220: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
8230: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
8240: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
8250: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
8260: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
8270: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
8280: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
8290: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
82a0: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
82b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
82c0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
82d0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
82e0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
82f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
8300: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
8310: 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74  ffSdst)==nResult
8320: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Col );.        s
8330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8340: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8350: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
8360: 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20  esultCol, .     
8370: 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
8380: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73  ->zAffSdst, nRes
8390: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
83a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
83b0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
83c0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
83d0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
83e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
83f0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
8400: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8410: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
8420: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
8430: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8440: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8450: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
8460: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8470: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
8480: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
8490: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
84a0: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
84b0: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
84c0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
84d0: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
84e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
84f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8500: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
8510: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
8520: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
8530: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
8540: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
8550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
8560: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
8570: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
8580: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
8590: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
85a0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
85b0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
85c0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
85d0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20   memory cell or 
85e0: 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a  array of .    **
85f0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8600: 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  d break out of t
8610: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
8620: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
8630: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69  T_Mem: {.      i
8640: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8650: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
8660: 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e  ultCol<=pDest->n
8670: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
8680: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
8690: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
86a0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
86b0: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
86c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
86d0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
86e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
86f0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
8700: 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol==pDest->nSdst
8710: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8720: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69  rt( regResult==i
8730: 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Parm );.        
8740: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
8750: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
8760: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
8770: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
8780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8790: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
87a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
87b0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
87c0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
87d0: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
87e0: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
87f0: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
8800: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
8810: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
8820: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
8830: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
8840: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
8850: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
8860: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8870: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
8880: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8890: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
88a0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
88b0: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
88c0: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
88d0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
8900: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8910: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8920: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
8930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8940: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
8950: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
8960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8980: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8990: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
89a0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
89b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
89c0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
89d0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
89e0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
89f0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
8a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a10: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8a20: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
8a30: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
8a40: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
8a50: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
8a60: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
8a70: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
8a80: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
8a90: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
8aa0: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
8ab0: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
8ac0: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
8ad0: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
8ae0: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
8af0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
8b00: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
8b10: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
8b20: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
8b30: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
8b40: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
8b50: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
8b60: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
8b70: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
8b80: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
8b90: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
8ba0: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
8bb0: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
8bc0: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
8bd0: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
8be0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
8bf0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
8c00: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
8c10: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
8c20: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
8c30: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
8c40: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
8c50: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
8c60: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
8c70: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
8c80: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
8c90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8ca0: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
8cb0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
8cc0: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
8cd0: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
8ce0: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
8cf0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
8d00: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
8d10: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
8d20: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
8d30: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
8d40: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
8d50: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
8d60: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
8d70: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
8d80: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
8d90: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
8da0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
8db0: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
8dc0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
8dd0: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
8de0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8df0: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
8e00: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
8e30: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8e40: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
8e50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8e60: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8e70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8e80: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
8e90: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8ea0: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
8eb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8ec0: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
8ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ee0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
8ef0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
8f00: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
8f10: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8f20: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
8f30: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
8f40: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
8f50: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
8f60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8f70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8f80: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
8fb0: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
8fc0: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
8ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9010: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
9020: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
9030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9040: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
9050: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
9060: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
9070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9080: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
9090: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
90a0: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
90b0: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
90c0: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
90d0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
90e0: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
90f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
9100: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
9110: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
9120: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
9130: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
9140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9150: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
9160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
9170: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
9180: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
9190: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
91a0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
91b0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
91c0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
91d0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
91e0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
91f0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
9200: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
9210: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
9220: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
9230: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
9240: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
9250: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
9260: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
9270: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
9280: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
9290: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
92a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
92b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
92c0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
92d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
92e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
92f0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
9300: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
9310: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
9320: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
9330: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
9340: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
9350: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
9360: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
9370: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
9380: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
9390: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
93a0: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
93b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
93c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
93d0: 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
93e0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
93f0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
9400: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
9410: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
9420: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
9430: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
9440: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
9450: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
9460: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
9470: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
9480: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
9490: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
94a0: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e   N, int X){.  in
94b0: 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29  t nExtra = (N+X)
94c0: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
94d0: 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43  *)+1) - sizeof(C
94e0: 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49  ollSeq*);.  KeyI
94f0: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
9500: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
9510: 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  , sizeof(KeyInfo
9520: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
9530: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
9540: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
9550: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
9560: 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c  .    p->nKeyFiel
9570: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
9580: 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28  p->nAllField = (
9590: 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70  u16)(N+X);.    p
95a0: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
95b0: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
95c0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
95d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b  ;.    memset(&p[
95e0: 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a  1], 0, nExtra);.
95f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
9600: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
9610: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
9630: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
9640: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
9650: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
9660: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
9670: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
9680: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
9690: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
96a0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
96b0: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
96c0: 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70  bFreeNN(p->db, p
96d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
96e0: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
96f0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
9700: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
9710: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
9720: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
9730: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
9740: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
9750: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
9760: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
9770: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
9780: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
9790: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
97a0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
97b0: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
97c0: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
97d0: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
97e0: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
97f0: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
9800: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
9810: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
9820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9830: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
9840: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
9850: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
9860: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
9870: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
9880: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
9890: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
98a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
98b0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
98c0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
98d0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
98e0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
98f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
9900: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
9910: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
9920: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
9930: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
9940: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
9950: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
9960: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
9970: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
9980: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
9990: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
99a0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
99b0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
99c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
99d0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
99e0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
99f0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
9a00: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
9a10: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
9a20: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
9a30: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
9a40: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
9a50: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
9a60: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
9a70: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
9a80: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
9a90: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
9aa0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
9ab0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
9ac0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
9ad0: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
9ae0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
9af0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
9b00: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
9b10: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
9b20: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
9b30: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
9b40: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
9b50: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
9b60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9b70: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
9b80: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9b90: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
9ba0: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
9bb0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9bc0: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
9bd0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
9be0: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
9bf0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
9c00: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
9c10: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
9c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9c30: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
9c40: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
9c50: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
9c60: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
9c70: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
9c80: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9c90: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
9ca0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9cb0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
9cc0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
9cd0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
9ce0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
9cf0: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
9d00: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
9d10: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
9d20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9d30: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
9d40: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
9d50: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
9d60: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
9d70: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
9d80: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
9d90: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
9da0: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
9db0: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
9dc0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
9dd0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
9de0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
9df0: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
9e00: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
9e10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9e20: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f  turn pInfo;.}../
9e30: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
9e40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
9e50: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
9e60: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
9e70: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
9e80: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
9e90: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
9ea0: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
9eb0: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
9ec0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
9ed0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
9ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9ef0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
9f00: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
9f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9f20: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
9f30: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
9f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
9f50: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
9f60: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
9f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
9f80: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
9f90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9fa0: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
9fb0: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
9fc0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
9fd0: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
9fe0: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
9ff0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
a000: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
a010: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
a020: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
a030: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
a040: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
a050: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
a060: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
a070: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
a080: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
a090: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
a0a0: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
a0b0: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
a0c0: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
a0d0: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
a0e0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
a0f0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
a100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a110: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
a120: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
a140: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  age){.  if( pPar
a150: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
a160: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
a170: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a180: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
a190: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
a1a0: 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20  Parse->db, "USE 
a1b0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
a1c0: 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20  %s", zUsage);.  
a1d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a1e0: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
a1f0: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
a200: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
a210: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
a220: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69   }.}../*.** Assi
a230: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
a240: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
a250: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
a260: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
a270: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
a280: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
a290: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
a2a0: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
a2b0: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
a2c0: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
a2d0: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
a2e0: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
a2f0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
a300: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
a310: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
a320: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
a330: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
a340: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
a350: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
a360: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
a370: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
a380: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
a390: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
a3a0: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
a3b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
a3c0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
a3d0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
a3e0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
a3f0: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
a400: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
a410: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
a420: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
a430: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a440: 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64  T_EXPLAIN) && !d
a450: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a460: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
a470: 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  CT)./*.** Unless
a480: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
a490: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
a4a0: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
a4b0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
a4c0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
a4d0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
a4e0: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
a4f0: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
a500: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
a510: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
a520: 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ion is of one of
a530: 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a   the two forms:.
a540: 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  **.**   "COMPOSI
a550: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
a560: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f  ub1 and iSub2 (o
a570: 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  p)".**   "COMPOS
a580: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
a590: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55  Sub1 and iSub2 U
a5a0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
a5b0: 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65   (op)".**.** whe
a5c0: 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  re iSub1 and iSu
a5d0: 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  b2 are the integ
a5e0: 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ers passed as th
a5f0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
a600: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ** function para
a610: 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69  meters, and op i
a620: 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  s the text repre
a630: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
a640: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
a650: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
a660: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f  The parameter "o
a670: 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p" must be one o
a680: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
a690: 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54  XCEPT,.** TK_INT
a6a0: 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c  ERSECT or TK_ALL
a6b0: 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  . The first form
a6c0: 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75   is used if argu
a6d0: 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20  ment bUseTmp is 
a6e0: 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68  .** false, or th
a6f0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66  e second form if
a700: 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   it is true..*/.
a710: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
a720: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20  ainComposite(.  
a730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
a760: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
a790: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
a7a0: 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  EPT etc. */.  in
a7b0: 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20  t iSub1,        
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7d0: 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a   Subquery id 1 *
a7e0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20  /.  int iSub2,  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
a810: 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55  id 2 */.  int bU
a820: 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20  seTmp           
a830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a840: 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c  e if a temp tabl
a850: 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b  e was used */.){
a860: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
a870: 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54  K_UNION || op==T
a880: 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
a890: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20  TK_INTERSECT || 
a8a0: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20  op==TK_ALL );.  
a8b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
a8c0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
a8d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a8e0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
a8f0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
a900: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
a910: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d  pParse->db, "COM
a920: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
a930: 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73   %d AND %d %s(%s
a940: 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  )", iSub1, iSub2
a950: 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d  ,.        bUseTm
a960: 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  p?"USING TEMP B-
a970: 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63  TREE ":"", selec
a980: 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20  tOpName(op).    
a990: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a9a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a9b0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a9c0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a9d0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a9e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
a9f0: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
aa00: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
aa10: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
aa20: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
aa30: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43   define explainC
aa40: 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79  omposite(v,w,x,y
aa50: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
aa60: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
aa70: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
aa80: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
aa90: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
aaa0: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
aab0: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
aac0: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
aad0: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
aae0: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
aaf0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
ab00: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
ab10: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
ab20: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
ab30: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
ab40: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
ab50: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
ab60: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
ab70: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
ab80: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
ab90: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
aba0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
abb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
abc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
abd0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
abe0: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
abf0: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
ac00: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
ac10: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
ac20: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
ac30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
ac40: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
ac50: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
ac60: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
ac70: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
ac80: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
ac90: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
aca0: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
acb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
acc0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
acd0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
ace0: 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d  drBreak = pSort-
acf0: 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20  >labelDone;     
ad00: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
ad10: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
ad20: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
ad30: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
ad40: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ad50: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
ad60: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
ad70: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  /.  int addr;.  
ad80: 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
ad90: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
ada0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
adb0: 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  By = pSort->pOrd
adc0: 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73  erBy;.  int eDes
add0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
ade0: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
adf0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a  pDest->iSDParm;.
ae00: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
ae10: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20  int regRowid;.  
ae20: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20  int iCol;.  int 
ae30: 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72  nKey;.  int iSor
ae40: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
ae60: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
ae70: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
ae80: 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20  SortData;       
ae90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
aea0: 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  ailing values to
aeb0: 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65   read from sorte
aec0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  r */.  int i;.  
aed0: 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20  int bSeq;       
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65  /* True if sorte
af00: 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65  r record include
af10: 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20  s seq. no. */.  
af20: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
af30: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
af40: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20  ->pEList->a;..  
af50: 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65 61  assert( addrBrea
af60: 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53 6f  k<0 );.  if( pSo
af70: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29  rt->labelBkOut )
af80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
af90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
afa0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
afb0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
afc0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
afd0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
afe0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
aff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b000: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
b010: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
b020: 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53  .  }.  iTab = pS
b030: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  ort->iECursor;. 
b040: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
b050: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
b060: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
b070: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
b080: 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64   ){.    regRowid
b090: 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77   = 0;.    regRow
b0a0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
b0b0: 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d  .    nSortData =
b0c0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
b0d0: 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  e{.    regRowid 
b0e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b0f0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
b100: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
b110: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
b120: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
b130: 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20      nSortData = 
b140: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20 20 6e  nColumn;.  }.  n
b150: 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Key = pOrderBy->
b160: 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e  nExpr - pSort->n
b170: 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f  OBSat;.  if( pSo
b180: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
b190: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
b1a0: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  er ){.    int re
b1b0: 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61  gSortOut = ++pPa
b1c0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
b1d0: 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73 65  SortTab = pParse
b1e0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66  ->nTab++;.    if
b1f0: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
b200: 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Out ){.      add
b210: 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56  rOnce = sqlite3V
b220: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
b230: 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
b240: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
b250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b260: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
b270: 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20  eudo, iSortTab, 
b280: 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79  regSortOut, nKey
b290: 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20  +1+nSortData);. 
b2a0: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
b2b0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
b2c0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
b2d0: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
b2e0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
b2f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
b300: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
b310: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
b320: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b330: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
b340: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
b350: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
b360: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b370: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
b380: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
b390: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
b3a0: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
b3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
b3c0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
b3d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
b3e0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
b3f0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
b400: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
b410: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
b420: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
b430: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
b440: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
b450: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
b460: 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b  (i=0, iCol=nKey+
b470: 62 53 65 71 3b 20 69 3c 6e 53 6f 72 74 44 61 74  bSeq; i<nSortDat
b480: 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  a; i++){.    int
b490: 20 69 52 65 61 64 3b 0a 20 20 20 20 69 66 28 20   iRead;.    if( 
b4a0: 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f  aOutEx[i].u.x.iO
b4b0: 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20  rderByCol ){.   
b4c0: 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45     iRead = aOutE
b4d0: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
b4e0: 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  yCol-1;.    }els
b4f0: 65 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d  e{.      iRead =
b500: 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iCol++;.    }. 
b510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b520: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b530: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65  n, iSortTab, iRe
b540: 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  ad, regRow+i);. 
b550: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
b560: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
b570: 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45  i].zName ? aOutE
b580: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
b590: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
b5a0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
b5b0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
b5c0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
b5d0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
b5e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b5f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b600: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
b610: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
b620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b630: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
b640: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
b650: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
b660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
b670: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
b680: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
b690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
b6a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b6b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
b6c0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
b6d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
b6e0: 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72  lumn==sqlite3Str
b6f0: 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66  len30(pDest->zAf
b700: 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20 20  fSdst) );.      
b710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b720: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
b730: 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  rd, regRow, nCol
b740: 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20  umn, regRowid,. 
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 41         pDest->zA
b770: 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  ffSdst, nColumn)
b780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b790: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
b7a0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
b7b0: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
b7c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b7d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
b7e0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
b7f0: 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65  rm, regRowid, re
b800: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  gRow, nColumn);.
b810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b820: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
b830: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  Mem: {.      /* 
b840: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
b850: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
b860: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
b870: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
b880: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b890: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b8a0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b8b0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
b8c0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b8d0: 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65  ine ); .      te
b8e0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
b8f0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
b900: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
b910: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
b920: 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  e );.      if( e
b930: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b940: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b950: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b960: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
b970: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
b980: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
b990: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
b9a0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
b9b0: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64  arse, pDest->iSd
b9c0: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
b9d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b9f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
ba00: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
ba10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ba20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ba30: 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64  }.  if( regRowid
ba40: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73   ){.    if( eDes
ba50: 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20  t==SRT_Set ){.  
ba60: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ba70: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
ba80: 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  se, regRow, nCol
ba90: 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  umn);.    }else{
baa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
bab0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
bac0: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
bad0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
bae0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
baf0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
bb00: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f  .  }.  /* The bo
bb10: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
bb20: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
bb30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
bb40: 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  v, addrContinue)
bb50: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  ;.  if( pSort->s
bb60: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
bb70: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
bb80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bb90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
bba0: 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  terNext, iTab, a
bbb0: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
bbc0: 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(v);.  }else{.
bbd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bbe0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
bbf0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
bc00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
bc10: 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d    }.  if( pSort-
bc20: 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c  >regReturn ) sql
bc30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
bc40: 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f  , OP_Return, pSo
bc50: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  rt->regReturn);.
bc60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
bc70: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
bc80: 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rBreak);.}../*.*
bc90: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
bca0: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
bcb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
bcc0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
bcd0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
bce0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
bcf0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
bd00: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
bd10: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
bd20: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74  **.** Also try t
bd30: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73  o estimate the s
bd40: 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ize of the retur
bd50: 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65  ned value and re
bd60: 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73  turn that.** res
bd70: 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74  ult in *pEstWidt
bd80: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  h..**.** The dec
bd90: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
bda0: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
bdb0: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
bdc0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
bdd0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
bde0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
bdf0: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
be00: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
be10: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
be20: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
be30: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
be40: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
be50: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
be60: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
be70: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
be80: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
be90: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
bea0: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
beb0: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
bec0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
bed0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
bee0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
bef0: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
bf00: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
bf10: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
bf20: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
bf30: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
bf40: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
bf50: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
bf60: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
bf70: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
bf80: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
bf90: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
bfa0: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
bfb0: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
bfc0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
bfd0: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
bfe0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
bff0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
c000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c010: 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20  tine has either 
c020: 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72  3 or 6 parameter
c030: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  s depending on w
c040: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
c050: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
c060: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c070: 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TA compile-time 
c080: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
c090: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
c0a0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c0b0: 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65  ETADATA.# define
c0c0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
c0d0: 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54  C,D,E,F) columnT
c0e0: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
c0f0: 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66  E,F).#else /* if
c100: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c110: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c120: 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65  ETADATA) */.# de
c130: 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28  fine columnType(
c140: 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c  A,B,C,D,E,F) col
c150: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
c160: 46 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  F).#endif.static
c170: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
c180: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
c190: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
c1a0: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
c1b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c1c0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c1d0: 41 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68  ADATA.  const ch
c1e0: 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20  ar **pzOrigDb,. 
c1f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
c200: 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74  OrigTab,.  const
c210: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f   char **pzOrigCo
c220: 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a  l,.#endif.  u8 *
c230: 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63  pEstWidth.){.  c
c240: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
c250: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
c260: 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31   u8 estWidth = 1
c270: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c280: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c290: 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f  TADATA.  char co
c2a0: 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  nst *zOrigDb = 0
c2b0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
c2c0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
c2d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
c2e0: 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  gCol = 0;.#endif
c2f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ..  assert( pExp
c300: 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
c310: 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
c320: 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  =0 );.  switch( 
c330: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
c340: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
c350: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
c360: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
c370: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c380: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
c390: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
c3a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
c3b0: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
c3c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
c3d0: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
c3e0: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
c3f0: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
c400: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
c410: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
c420: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
c430: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
c440: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
c450: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
c460: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
c470: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
c480: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
c490: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c4a0: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
c4b0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
c4c0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
c4d0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
c4e0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
c4f0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
c500: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
c510: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
c520: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
c530: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
c540: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
c550: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
c560: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
c570: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
c580: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
c590: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
c5a0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
c5b0: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
c5c0: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
c5d0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
c5e0: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
c5f0: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
c600: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
c610: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
c620: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
c630: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
c640: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
c650: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
c660: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
c670: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
c680: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
c690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c6a0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
c6b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
c6c0: 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f   At one time, co
c6d0: 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45  de such as "SELE
c6e0: 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e  CT new.x" within
c6f0: 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64   a trigger would
c700: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73  .        ** caus
c710: 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  e this condition
c720: 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20   to run.  Since 
c730: 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65  then, we have re
c740: 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20  structured how. 
c750: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
c760: 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  r code is genera
c770: 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ted and so this 
c780: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20  condition is no 
c790: 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20  longer .        
c7a0: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77  ** possible. How
c7b0: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69  ever, it can sti
c7c0: 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73  ll be true for s
c7d0: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20  tatements like. 
c7e0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f         ** the fo
c7f0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20  llowing:.       
c800: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
c810: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
c820: 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20  (col INTEGER);. 
c830: 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
c840: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  CT (SELECT t1.co
c850: 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b  l) FROM FROM t1;
c860: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
c870: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75      ** when colu
c880: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
c890: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
c8a0: 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e  sion "t1.col" in
c8b0: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
c8c0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20   sub-select. In 
c8d0: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
c8e0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74  he column type t
c8f0: 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20  o NULL, even.   
c900: 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69       ** though i
c910: 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20  t should really 
c920: 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20  be "INTEGER"..  
c930: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c940: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
c950: 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68  a problem, as th
c960: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66  e column type of
c970: 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76   "t1.col" is nev
c980: 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  er.        ** us
c990: 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54  ed. When columnT
c9a0: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
c9b0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
c9c0: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28  n .        ** "(
c9d0: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c  SELECT t1.col)",
c9e0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
c9f0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73  e is returned (s
ca00: 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54  ee the TK_SELECT
ca10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e  .        ** bran
ca20: 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ch below.  */.  
ca30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ca40: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
ca50: 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70  rt( pTab && pExp
ca60: 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  r->pTab==pTab );
ca70: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
ca80: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
ca90: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
caa0: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
cab0: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
cac0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
cad0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
cae0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
caf0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
cb00: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
cb10: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
cb20: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
cb30: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
cb40: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
cb50: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
cb60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
cb70: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d  l>=0 && iCol<pS-
cb80: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
cb90: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
cba0: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
cbb0: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
cbc0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
cbd0: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
cbe0: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
cbf0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
cc00: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
cc10: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
cc20: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
cc30: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
cc40: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
cc50: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
cc60: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
cc70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
cc80: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
cc90: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
cca0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
ccb0: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
ccc0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
ccd0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
cce0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
ccf0: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
cd00: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
cd10: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
cd20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
cd30: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
cd40: 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c  sNC, p,&zOrigDb,
cd50: 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67  &zOrigTab,&zOrig
cd60: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
cd70: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
cd80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
cd90: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
cda0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
cdb0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
cdc0: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
cdd0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
cde0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
cdf0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
ce00: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
ce10: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
ce20: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
ce30: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
ce40: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
ce50: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20  METADATA.       
ce60: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
ce70: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
ce80: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
ce90: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
cea0: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
ceb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cec0: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
ced0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
cee0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
cef0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
cf00: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
cf10: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
cf20: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
cf30: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
cf40: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
cf50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
cf60: 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e  OrigTab = pTab->
cf70: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
cf80: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
cf90: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
cfa0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
cfb0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
cfc0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
cfd0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
cfe0: 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20        zOrigDb = 
cff0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
d000: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
d010: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
d020: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
d030: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
d040: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
d050: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
d060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d070: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
d080: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
d090: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
d0a0: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
d0b0: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
d0c0: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
d0d0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
d0e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d0f0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
d100: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
d110: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
d120: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
d130: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
d140: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
d150: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
d160: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d170: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
d180: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
d190: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
d1a0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d1b0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
d1c0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
d1d0: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
d1e0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
d1f0: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
d200: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
d210: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
d220: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
d230: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
d240: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
d250: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
d260: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
d270: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
d280: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
d290: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
d2a0: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
d2b0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
d2c0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
d2d0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d2e0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
d2f0: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
d300: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  ab, &zOrigCol, &
d310: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
d320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
d330: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65  endif.  }..#ifde
d340: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d350: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
d360: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62   .  if( pzOrigDb
d370: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d380: 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f  pzOrigTab && pzO
d390: 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  rigCol );.    *p
d3a0: 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44  zOrigDb = zOrigD
d3b0: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61  b;.    *pzOrigTa
d3c0: 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20  b = zOrigTab;.  
d3d0: 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a    *pzOrigCol = z
d3e0: 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e  OrigCol;.  }.#en
d3f0: 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69  dif.  if( pEstWi
d400: 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68  dth ) *pEstWidth
d410: 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72   = estWidth;.  r
d420: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
d430: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d440: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
d450: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
d460: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d470: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
d480: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d490: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
d4a0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
d4b0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
d4c0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
d4d0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
d4e0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
d4f0: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
d500: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
d510: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
d520: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d530: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
d540: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
d550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d560: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
d570: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
d580: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
d590: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
d5a0: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
d5b0: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
d5c0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
d5d0: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  arse;.  sNC.pNex
d5e0: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 0;.  for(i=0
d5f0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d600: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d610: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
d620: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
d630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
d640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d650: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
d660: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
d670: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
d680: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
d690: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
d6a0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
d6b0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
d6c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d6d0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d6e0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
d6f0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
d700: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
d710: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
d720: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
d730: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
d740: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
d750: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
d760: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
d770: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
d780: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
d790: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
d7a0: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
d7b0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
d7c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d7d0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d7e0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
d7f0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
d800: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
d810: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d820: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d830: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
d840: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
d850: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
d860: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d870: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
d880: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
d890: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d8a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
d8b0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
d8c0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
d8d0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
d8e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d8f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d900: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
d910: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
d920: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
d930: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
d940: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
d950: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
d960: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
d970: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
d980: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
d990: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
d9a0: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
d9b0: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
d9c0: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
d9d0: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
d9e0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
d9f0: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
da00: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
da10: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
da20: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
da30: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
da40: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
da50: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
da60: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
da70: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
da80: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
da90: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
daa0: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
dab0: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
dac0: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
dad0: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
dae0: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
daf0: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
db00: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
db10: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
db20: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
db30: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
db40: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
db50: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
db60: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
db70: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
db80: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
db90: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
dba0: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
dbb0: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
dbc0: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
dbd0: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
dbe0: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
dbf0: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
dc00: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
dc10: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
dc20: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
dc30: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
dc40: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
dc50: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
dc60: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
dc70: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
dc80: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
dc90: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
dca0: 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
dcb0: 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
dcc0: 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
dcf0: 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
dd00: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
dd10: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
dd40: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
dd50: 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
dd60: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
dd70: 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
dd80: 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
dd90: 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
dda0: 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
ddb0: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
ddc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
dde0: 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
ddf0: 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
de00: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
de30: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
de40: 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
de50: 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
de80: 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
de90: 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
dea0: 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
deb0: 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
dec0: 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
ded0: 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
dee0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
def0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
df10: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
df20: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
df30: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
df40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
df60: 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
df70: 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
df80: 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
df90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
dfa0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
dfb0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
dfc0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
dfd0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
dfe0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
dff0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
e000: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
e010: 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
e020: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
e030: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
e040: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
e050: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
e060: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
e070: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
e080: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
e090: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e0a0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
e0b0: 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
e0c0: 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
e0d0: 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
e0e0: 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
e0f0: 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
e100: 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
e110: 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
e120: 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
e130: 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
e140: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
e150: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
e160: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
e170: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
e180: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
e190: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
e1a0: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
e1b0: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
e1c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
e1d0: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e  NamesSet || db->
e1e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
e1f0: 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75  eturn;.  /* Colu
e200: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64 65 74  mn names are det
e210: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6c  ermined by the l
e220: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
e230: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
e240: 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  ct */.  while( p
e250: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
e260: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
e270: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 70 54  ct->pPrior;.  pT
e280: 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  abList = pSelect
e290: 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
e2a0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
e2b0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  st;.  assert( v!
e2c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e2d0: 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pTabList!=0 );. 
e2e0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
e2f0: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
e300: 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  Name = (db->flag
e310: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
e320: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
e330: 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c  rcName = (db->fl
e340: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
e350: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 7c  rtColNames)!=0 |
e360: 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73 71  | fullName;.  sq
e370: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
e380: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
e390: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
e3a0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
e3b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
e3c0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
e3d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20  [i].pExpr;..    
e3e0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
e3f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
e400: 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
e410: 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72 6f 63   );  /* Agg proc
e420: 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74 20 72  essing has not r
e430: 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20 61 73  un yet */.    as
e440: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
e450: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54 61  COLUMN || p->pTa
e460: 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72  b!=0 ); /* Cover
e470: 69 6e 67 20 69 64 78 20 6e 6f 74 20 79 65 74 20  ing idx not yet 
e480: 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  coded */.    if(
e490: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
e4a0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
e4b0: 41 6e 20 41 53 20 63 6c 61 75 73 65 20 61 6c 77  An AS clause alw
e4c0: 61 79 73 20 74 61 6b 65 73 20 66 69 72 73 74 20  ays takes first 
e4d0: 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20  priority */.    
e4e0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
e4f0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
e500: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
e510: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
e520: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
e530: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
e540: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
e550: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 72 63 4e    }else if( srcN
e560: 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b  ame && p->op==TK
e570: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
e580: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
e590: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
e5a0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
e5b0: 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a  pTab = p->pTab;.
e5c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e5d0: 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ab!=0 );.      i
e5e0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
e5f0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
e600: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
e610: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
e620: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
e630: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
e640: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
e650: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
e660: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
e670: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
e680: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
e690: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
e6a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c  }.      if( full
e6b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
e6c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
e6d0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e6e0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e6f0: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
e700: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b  b->zName, zCol);
e710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e720: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
e730: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
e740: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
e750: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
e760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e770: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e780: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
e790: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
e7a0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
e7b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e7c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
e7d0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69  t char *z = pELi
e7e0: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
e7f0: 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f        z = z==0 ?
e800: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e810: 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  db, "column%d", 
e820: 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62  i+1) : sqlite3Db
e830: 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20  StrDup(db, z);. 
e840: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e850: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
e860: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
e870: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e880: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67  );.    }.  }.  g
e890: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
e8a0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
e8b0: 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a  ist, pEList);.}.
e8c0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
e8d0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e8e0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
e8f0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
e900: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
e910: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
e920: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
e930: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
e940: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
e950: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
e960: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
e970: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
e980: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
e990: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
e9a0: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
e9b0: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
e9c0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
e9d0: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
e9e0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
e9f0: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
ea00: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
ea10: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
ea20: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
ea30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
ea40: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
ea50: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
ea60: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
ea70: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
ea80: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
ea90: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
eaa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
eab0: 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c  M..**.** The onl
eac0: 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  y guarantee that
ead0: 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62   SQLite makes ab
eae0: 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  out column names
eaf0: 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a   is that if the.
eb00: 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e  ** column has an
eb10: 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67   AS clause assig
eb20: 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20  ning it a name, 
eb30: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65  that will be the
eb40: 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54   name used..** T
eb50: 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  hat is the only 
eb60: 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61  documented guara
eb70: 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  ntee.  However, 
eb80: 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63  countless applic
eb90: 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f  ations.** develo
eba0: 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61  ped over the yea
ebb0: 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73  rs have made bas
ebc0: 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e  eless assumption
ebd0: 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
ebe0: 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c  ames.** and will
ebf0: 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20   break if those 
ec00: 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e  assumptions chan
ec10: 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65  ges.  Hence, use
ec20: 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e   extreme caution
ec30: 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69  .** when modifyi
ec40: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
ec50: 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e  to avoid breakin
ec60: 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20  g legacy..**.** 
ec70: 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61  See Also: genera
ec80: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a  teColumnNames().
ec90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
eca0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
ecb0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
ecc0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ecd0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
ece0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
ecf0: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
ed00: 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77  Expr list from w
ed10: 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63  hich to derive c
ed20: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
ed30: 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   i16 *pnCol,    
ed40: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
ed50: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
ed60: 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a  columns here */.
ed70: 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c    Column **paCol
ed80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
ed90: 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  te the new colum
eda0: 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29  n list here */.)
edb0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
edc0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
edd0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
ede0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
edf0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
ee00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ee10: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33  counters */.  u3
ee20: 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  2 cnt;          
ee30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ee40: 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65  ex added to make
ee50: 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65   the name unique
ee60: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
ee70: 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20  ol, *pCol;      
ee80: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
ee90: 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c   over result col
eea0: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  umns */.  int nC
eeb0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
eec0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
eed0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
eee0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
eef0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef10: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
ef20: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef40: 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e   Size of name in
ef50: 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61   zName[] */.  Ha
ef60: 73 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20  sh ht;          
ef70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
ef80: 68 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d  h table of colum
ef90: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71  n names */..  sq
efa0: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68  lite3HashInit(&h
efb0: 74 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  t);.  if( pEList
efc0: 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   ){.    nCol = p
efd0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
efe0: 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    aCol = sqlite3
eff0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f000: 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29   sizeof(aCol[0])
f010: 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74  *nCol);.    test
f020: 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b  case( aCol==0 );
f030: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
f040: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c  ol = 0;.    aCol
f050: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
f060: 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e  rt( nCol==(i16)n
f070: 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20  Col );.  *pnCol 
f080: 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c  = nCol;.  *paCol
f090: 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28   = aCol;..  for(
f0a0: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
f0b0: 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d  i<nCol && !db->m
f0c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b  allocFailed; i++
f0d0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
f0e0: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
f0f0: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
f100: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
f110: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
f120: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
f130: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
f140: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
f150: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
f160: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
f170: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
f180: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
f190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
f1a0: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 73 71  r *pColExpr = sq
f1b0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
f1c0: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
f1d0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
f1e0: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
f1f0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
f200: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
f210: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
f220: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
f230: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
f240: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f250: 20 69 66 28 20 28 70 43 6f 6c 45 78 70 72 2d 3e   if( (pColExpr->
f260: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
f270: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
f280: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 0a 20 20  K_AGG_COLUMN).  
f290: 20 20 20 20 20 26 26 20 70 43 6f 6c 45 78 70 72       && pColExpr
f2a0: 2d 3e 70 54 61 62 21 3d 30 20 0a 20 20 20 20 20  ->pTab!=0 .     
f2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
f2c0: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
f2d0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
f2e0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
f2f0: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
f300: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
f310: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
f320: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
f330: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
f340: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
f350: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
f360: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c      zName = iCol
f370: 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  >=0 ? pTab->aCol
f380: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22  [iCol].zName : "
f390: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
f3a0: 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72  lse if( pColExpr
f3b0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
f3c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
f3d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f3e0: 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74  pColExpr, EP_Int
f3f0: 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
f400: 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78    zName = pColEx
f410: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
f420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f430: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
f440: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
f450: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
f460: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
f470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   */.        zNam
f480: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
f490: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a  .zSpan;.      }.
f4a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e      }.    if( zN
f4b0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61  ame ){.      zNa
f4c0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
f4d0: 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  rDup(db, zName);
f4e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f4f0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
f500: 33 4d 50 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c  3MPrintf(db,"col
f510: 75 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20  umn%d",i+1);.   
f520: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
f530: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
f540: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
f550: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
f560: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
f570: 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74  ** append an int
f580: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
f590: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
f5a0: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
f5b0: 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  */.    cnt = 0;.
f5c0: 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65      while( zName
f5d0: 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46   && sqlite3HashF
f5e0: 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21  ind(&ht, zName)!
f5f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d  =0 ){.      nNam
f600: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
f610: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
f620: 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b    if( nName>0 ){
f630: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e  .        for(j=n
f640: 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73  Name-1; j>0 && s
f650: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e  qlite3Isdigit(zN
f660: 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a  ame[j]); j--){}.
f670: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
f680: 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[j]==':' ) nNam
f690: 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  e = j;.      }. 
f6a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
f6b0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
f6c0: 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65  "%.*z:%u", nName
f6d0: 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b  , zName, ++cnt);
f6e0: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33  .      if( cnt>3
f6f0: 20 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f   ) sqlite3_rando
f700: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74  mness(sizeof(cnt
f710: 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a  ), &cnt);.    }.
f720: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
f730: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c  = zName;.    sql
f740: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
f750: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20  tiesFromName(0, 
f760: 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a  pCol);.    if( z
f770: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
f780: 61 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a  ashInsert(&ht, z
f790: 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f  Name, pCol)==pCo
f7a0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
f7b0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
f7c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
f7d0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74  te3HashClear(&ht
f7e0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
f7f0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f800: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a   for(j=0; j<i; j
f810: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
f820: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
f830: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
f840: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
f850: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a  Free(db, aCol);.
f860: 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a      *paCol = 0;.
f870: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a      *pnCol = 0;.
f880: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f890: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
f8a0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
f8b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
f8c0: 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  dd type and coll
f8d0: 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
f8e0: 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69  n to a column li
f8f0: 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  st based on.** a
f900: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f910: 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  t..** .** The co
f920: 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d  lumn list presum
f930: 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73  ably came from s
f940: 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  electColumnNames
f950: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a  FromExprList()..
f960: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
f970: 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65  st has only name
f980: 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20  s, not types or 
f990: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69  collations.  Thi
f9a0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65  s.** routine goe
f9b0: 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64  s through and ad
f9c0: 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64  ds the types and
f9d0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   collations..**.
f9e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f9f0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c  requires that al
fa00: 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  l identifiers in
fa10: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73   the SELECT.** s
fa20: 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f  tatement be reso
fa30: 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lved..*/.void sq
fa40: 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
fa50: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
fa60: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
fa70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
fa80: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
fa90: 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  s */.  Table *pT
faa0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
fab0: 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  Add column type 
fac0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
fad0: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  his table */.  S
fae0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
faf0: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75       /* SELECT u
fb00: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
fb10: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
fb20: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  tions */.){.  sq
fb30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
fb40: 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f  se->db;.  NameCo
fb50: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c  ntext sNC;.  Col
fb60: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c  umn *pCol;.  Col
fb70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
fb80: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b  nt i;.  Expr *p;
fb90: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
fba0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36  st_item *a;.  u6
fbb0: 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20  4 szAll = 0;..  
fbc0: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21  assert( pSelect!
fbd0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
fbe0: 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61  (pSelect->selFla
fbf0: 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
fc00: 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
fc10: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53  ( pTab->nCol==pS
fc20: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
fc30: 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
fc40: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
fc50: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
fc60: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  ed ) return;.  m
fc70: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
fc80: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
fc90: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
fca0: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61  elect->pSrc;.  a
fcb0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
fcc0: 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30  st->a;.  for(i=0
fcd0: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
fce0: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
fcf0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
fd00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fd10: 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c  Type;.    int n,
fd20: 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d   m;.    p = a[i]
fd30: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70  .pExpr;.    zTyp
fd40: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
fd50: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c  sNC, p, 0, 0, 0,
fd60: 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a   &pCol->szEst);.
fd70: 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f      szAll += pCo
fd80: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43  l->szEst;.    pC
fd90: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
fda0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
fdb0: 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  ty(p);.    if( z
fdc0: 54 79 70 65 20 26 26 20 28 6d 20 3d 20 73 71 6c  Type && (m = sql
fdd0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
fde0: 70 65 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  pe))>0 ){.      
fdf0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
fe00: 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  n30(pCol->zName)
fe10: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e  ;.      pCol->zN
fe20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52  ame = sqlite3DbR
fe30: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c  eallocOrFree(db,
fe40: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b   pCol->zName, n+
fe50: 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+2);.      if( 
fe60: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pCol->zName ){. 
fe70: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
fe80: 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c  Col->zName[n+1],
fe90: 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20   zType, m+1);.  
fea0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
feb0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
fec0: 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d  HASTYPE;.      }
fed0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
fee0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
fef0: 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
ff00: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
ff10: 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  LOB;.    pColl =
ff20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
ff30: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
ff40: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
ff50: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20   pCol->zColl==0 
ff60: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
ff70: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
ff80: 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
ff90: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
ffa0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61    }.  pTab->szTa
ffb0: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
ffc0: 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d  gEst(szAll*4);.}
ffd0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
ffe0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fff0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
10000 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
10010 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
10020 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
10030 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
10040 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
10050 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
10060 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10070 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
10080 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
10090 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
100a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
100b0 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a  nt savedFlags;..
100c0 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64    savedFlags = d
100d0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e  b->flags;.  db->
100e0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
100f0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
10100 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
10110 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
10120 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  es;.  sqlite3Sel
10130 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
10140 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10150 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
10160 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
10170 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
10180 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
10190 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
101a0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20  ;.  db->flags = 
101b0 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54  savedFlags;.  pT
101c0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
101d0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
101e0 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
101f0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
10200 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10210 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65  .  /* The sqlite
10220 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
10230 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65  ct() is only use
10240 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65  d n contexts whe
10250 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a  re lookaside.  *
10260 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  * is disabled */
10270 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
10280 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
10290 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61  e );.  pTab->nTa
102a0 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  bRef = 1;.  pTab
102b0 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
102c0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
102d0 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
102e0 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
102f0 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
10300 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
10310 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
10320 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
10330 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
10340 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
10350 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
10360 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
10370 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
10380 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
10390 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
103a0 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
103b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
103c0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
103d0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
103e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
103f0 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
10400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
10410 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
10420 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
10430 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
10440 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
10450 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
10460 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
10470 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
10480 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
10490 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
104a0 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
104b0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
104c0 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  f( pParse->pVdbe
104d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
104e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
104f0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
10500 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20  pToplevel==0.   
10510 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
10520 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
10530 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  b,SQLITE_FactorO
10540 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20  utConst).  ){.  
10550 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
10560 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d  tFactor = 1;.  }
10570 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
10580 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
10590 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  se);.}.../*.** C
105a0 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
105b0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
105c0 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
105d0 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
105e0 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
105f0 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
10600 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
10610 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
10620 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
10630 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
10640 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
10650 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
10660 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
10670 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
10680 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
10690 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
106a0 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
106b0 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
106c0 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
106d0 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
106e0 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
106f0 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
10700 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
10710 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
10720 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
10730 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
10740 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
10750 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
10760 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
10770 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10780 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
10790 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
107a0 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
107b0 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
107c0 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
107d0 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
107e0 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
107f0 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
10800 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
10810 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
10820 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
10830 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20  alues (zero).** 
10840 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
10850 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
10860 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74  *.** The iOffset
10870 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74   register (if it
10880 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74   exists) is init
10890 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
108a0 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f  alue.** of the O
108b0 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d  FFSET.  The iLim
108c0 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69  it register is i
108d0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
108e0 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a  MIT.  Register.*
108f0 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69  * iOffset+1 is i
10900 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
10910 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  MIT+OFFSET..**.*
10920 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
10930 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
10940 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
10950 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
10960 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
10970 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
10980 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
10990 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
109a0 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
109b0 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
109c0 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
109d0 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
109e0 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
109f0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
10a00 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
10a10 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
10a20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
10a30 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
10a40 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
10a50 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
10a60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
10a70 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  set;.  int n;.  
10a80 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
10a90 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
10aa0 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
10ab0 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
10ac0 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
10ad0 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
10ae0 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
10af0 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
10b00 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
10b10 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
10b20 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
10b30 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
10b40 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
10b50 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
10b60 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
10b70 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
10b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
10b90 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
10ba0 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
10bb0 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
10bc0 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
10bd0 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
10be0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
10bf0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
10c00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73  pParse);.    ass
10c10 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
10c20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
10c30 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69  IsInteger(p->pLi
10c40 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  mit, &n) ){.    
10c50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10c60 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
10c70 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
10c80 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10c90 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
10ca0 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
10cb0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
10cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
10cd0 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  o(v, iBreak);.  
10ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
10cf0 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
10d00 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73  Row>sqlite3LogEs
10d10 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20  t((u64)n) ){.   
10d20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
10d30 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
10d40 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20  st((u64)n);.    
10d50 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
10d60 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  |= SF_FixedLimit
10d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10d80 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
10d90 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10da0 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
10db0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
10dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10dd0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
10de0 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
10df0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10e00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10e10 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
10e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10e40 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
10e50 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
10e60 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
10e70 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73      if( p->pOffs
10e80 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  et ){.      p->i
10e90 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
10ea0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10eb0 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
10ec0 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
10ed0 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
10ee0 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
10ef0 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
10f00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10f10 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
10f20 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b  ffset, iOffset);
10f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10f40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
10f50 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65  ustBeInt, iOffse
10f60 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
10f70 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
10f80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
10f90 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
10fa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10fb0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
10fc0 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74  setLimit, iLimit
10fd0 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f 66  , iOffset+1, iOf
10fe0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  fset);.      Vdb
10ff0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
11000 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
11010 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
11020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11030 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
11040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11050 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
11060 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
11070 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
11080 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
11090 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
110a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
110b0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
110c0 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
110d0 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
110e0 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
110f0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
11100 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
11110 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11120 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
11130 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
11140 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
11150 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
11160 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
11170 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
11180 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
11190 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
111a0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
111b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
111c0 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
111d0 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
111e0 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
111f0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
11200 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
11210 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
11220 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
11230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
11240 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
11250 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
11260 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20  .  /* iCol must 
11270 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e  be less than p->
11280 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20  pEList->nExpr.  
11290 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  Otherwise an err
112a0 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61  or would.  ** ha
112b0 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20 64  ve been thrown d
112c0 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c  uring name resol
112d0 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75  ution and we wou
112e0 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74 74  ld not have gott
112f0 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 72  en.  ** this far
11300 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   */.  if( pRet==
11310 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c  0 && ALWAYS(iCol
11320 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
11330 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  r) ){.    pRet =
11340 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
11350 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
11360 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
11370 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
11380 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
11390 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
113a0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
113b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
113c0 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70  ameter is a comp
113d0 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77  ound SELECT.** w
113e0 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
113f0 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e  clause. This fun
11400 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
11410 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65  and returns a Ke
11420 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  yInfo.** structu
11430 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  re suitable for 
11440 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
11450 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a   ORDER BY..**.**
11460 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
11470 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
11480 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64  ture is obtained
11490 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68   from malloc. Th
114a0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
114b0 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
114c0 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
114d0 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
114e0 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
114f0 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f  lly.** freed..*/
11500 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
11510 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65  *multiSelectOrde
11520 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  rByKeyInfo(Parse
11530 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
11540 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29   *p, int nExtra)
11550 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
11560 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
11570 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64  erBy;.  int nOrd
11580 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
11590 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c  By->nExpr;.  sql
115a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
115b0 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f  e->db;.  KeyInfo
115c0 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
115d0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
115e0 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61   nOrderBy+nExtra
115f0 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74  , 1);.  if( pRet
11600 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
11610 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
11620 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
11630 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
11640 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
11650 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  = &pOrderBy->a[i
11660 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ];.      Expr *p
11670 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Term = pItem->pE
11680 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  xpr;.      CollS
11690 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20  eq *pColl;..    
116a0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
116b0 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
116c0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
116d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
116e0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54  llSeq(pParse, pT
116f0 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  erm);.      }els
11700 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e{.        pColl
11710 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
11720 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
11730 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
11740 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  erByCol-1);.    
11750 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
11760 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
11770 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
11780 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
11790 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  .pExpr =.       
117a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
117b0 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70  dCollateString(p
117c0 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43  Parse, pTerm, pC
117d0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
117e0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
117f0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
11800 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52 65  oIsWriteable(pRe
11810 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74  t) );.      pRet
11820 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
11830 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e  ll;.      pRet->
11840 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
11850 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
11860 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
11870 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
11880 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  et;.}..#ifndef S
11890 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
118a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
118b0 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45  e generates VDBE
118c0 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65   code to compute
118d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
118e0 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45  a WITH RECURSIVE
118f0 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65  .** query of the
11900 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c   form:.**.**   <
11910 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e  recursive-table>
11920 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72   AS (<setup-quer
11930 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c  y> UNION [ALL] <
11940 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e  recursive-query>
11950 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
11970 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
11980 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
11990 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20       p.**.**.** 
119e0 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c 79  There is exactly
119f0 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
11a00 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  o the recursive-
11a10 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
11a20 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72  M clause.** of r
11a30 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20  ecursive-query, 
11a40 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65 20  marked with the 
11a50 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e  SrcList->a[].fg.
11a60 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61 67  isRecursive flag
11a70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75  ..**.** The setu
11a80 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63  p-query runs onc
11a90 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
11aa0 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20   initial set of 
11ab0 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20  rows that go.** 
11ac0 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61 62  into a Queue tab
11ad0 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78  le.  Rows are ex
11ae0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
11af0 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65   Queue table one
11b00 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63   by.** one.  Eac
11b10 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64 20  h row extracted 
11b20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75  from Queue is ou
11b30 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20  tput to pDest.  
11b40 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a  Then the single.
11b50 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f 77  ** extracted row
11b60 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75   (now in the iCu
11b70 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63  rrent table) bec
11b80 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  omes the content
11b90 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72   of the.** recur
11ba0 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61  sive-table for a
11bb0 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
11bc0 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75   run.  The outpu
11bd0 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  t of the recursi
11be0 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61  ve-query.** is a
11bf0 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  dded back into t
11c00 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
11c10 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f   Then another ro
11c20 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  w is extracted f
11c30 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64  rom Queue.** and
11c40 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63   the iteration c
11c50 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74  ontinues until t
11c60 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
11c70 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
11c80 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
11c90 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73  uery operator is
11ca0 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64   UNION then no d
11cb0 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72  uplicate rows ar
11cc0 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74  e ever.** insert
11cd0 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75  ed into the Queu
11ce0 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44  e table.  The iD
11cf0 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65  istinct table ke
11d00 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c  eps a copy of al
11d10 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68  l rows.** that h
11d20 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e  ave ever been in
11d30 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75  serted into Queu
11d40 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75 70  e and causes dup
11d50 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a  licates to be.**
11d60 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 20   discarded.  If 
11d70 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  the operator is 
11d80 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20  UNION ALL, then 
11d90 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20 61  duplicates are a
11da0 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49  llowed..** .** I
11db0 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73 20  f the query has 
11dc0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
11dd0 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  n entries in the
11de0 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72 65   Queue table are
11df0 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45   kept in.** ORDE
11e00 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74  R BY order and t
11e10 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
11e20 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72 20  s extracted for 
11e30 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74  each cycle.  Wit
11e40 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52  hout.** an ORDER
11e50 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20 74   BY, the Queue t
11e60 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46  able is just a F
11e70 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  IFO..**.** If a 
11e80 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20  LIMIT clause is 
11e90 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74  provided, then t
11ea0 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f  he iteration sto
11eb0 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72  ps after LIMIT r
11ec0 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ows.** have been
11ed0 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74   output to pDest
11ee0 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65  .  A LIMIT of ze
11ef0 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  ro means to outp
11f00 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61  ut no rows and a
11f10 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d  .** negative LIM
11f20 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  IT means to outp
11f30 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66  ut all rows.  If
11f40 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   there is also a
11f50 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
11f60 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74 69  ** with a positi
11f70 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  ve value, then t
11f80 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
11f90 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73 63  outputs are disc
11fa0 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20  arded rather.** 
11fb0 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20  than being sent 
11fc0 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c  to pDest.  The L
11fd0 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20  IMIT count does 
11fe0 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20  not begin until 
11ff0 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20  after OFFSET.** 
12000 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 73  rows have been s
12010 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
12020 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57  c void generateW
12030 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72  ithRecursiveQuer
12040 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
12050 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
12060 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12070 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
12080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12090 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
120a0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
120b0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
120c0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
120d0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
120e0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
120f0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
12100 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f   p->pSrc;      /
12110 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
12120 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  e of the recursi
12130 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ve query */.  in
12140 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  t nCol = p->pELi
12150 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e  st->nExpr;  /* N
12160 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
12170 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
12180 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62  e table */.  Vdb
12190 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
121a0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
121b0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
121c0 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
121d0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ruction */.  Sel
121e0 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d  ect *pSetup = p-
121f0 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68  >pPrior;   /* Th
12200 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f  e setup query */
12210 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
12240 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
12250 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
12260 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e  ;      /* CONTIN
12270 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64  UE and BREAK add
12280 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20  resses */.  int 
12290 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  iCurrent = 0;   
122a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
122b0 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
122c0 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72 65  /.  int regCurre
122d0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
122e0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
122f0 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61  lding Current ta
12300 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75  ble */.  int iQu
12310 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  eue;            
12320 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75         /* The Qu
12330 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
12340 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30  nt iDistinct = 0
12350 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12360 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65  To ensure unique
12370 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f   results if UNIO
12380 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  N */.  int eDest
12390 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20   = SRT_Fifo;    
123a0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77       /* How to w
123b0 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f  rite to Queue */
123c0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
123d0 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20 20  stQueue;        
123e0 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74   /* SelectDest t
123f0 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51 75  argetting the Qu
12400 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
12410 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12430 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
12440 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
12470 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
12480 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
12490 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
124a0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  Y clause */.  Ex
124b0 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
124c0 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  fset;       /* S
124d0 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f  aved LIMIT and O
124e0 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72  FFSET */.  int r
124f0 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73  egLimit, regOffs
12500 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69  et;      /* Regi
12510 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c 49  sters used by LI
12520 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a  MIT and OFFSET *
12530 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  /..  /* Obtain a
12540 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
12550 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20 71  do a recursive q
12560 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71  uery */.  if( sq
12570 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
12580 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
12590 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30  CURSIVE, 0, 0, 0
125a0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
125b0 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49  * Process the LI
125c0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
125d0 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79 20  lauses, if they 
125e0 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42  exist */.  addrB
125f0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
12600 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12610 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
12620 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c  = 320;  /* 4 bil
12630 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63  lion rows */.  c
12640 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
12650 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
12660 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c  addrBreak);.  pL
12670 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
12680 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d  ;.  pOffset = p-
12690 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c  >pOffset;.  regL
126a0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
126b0 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20  ;.  regOffset = 
126c0 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
126d0 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66  >pLimit = p->pOf
126e0 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  fset = 0;.  p->i
126f0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73  Limit = p->iOffs
12700 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72  et = 0;.  pOrder
12710 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
12720 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
12730 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
12740 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20   of the Current 
12750 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
12760 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72  =0; ALWAYS(i<pSr
12770 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a  c->nSrc); i++){.
12780 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
12790 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  i].fg.isRecursiv
127a0 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
127b0 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
127c0 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
127d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
127e0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
127f0 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
12800 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
12810 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
12820 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
12830 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
12840 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
12850 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
12860 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
12870 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
12880 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
12890 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
128a0 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
128b0 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
128c0 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
128d0 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
128e0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
128f0 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
12900 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
12910 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
12920 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
12930 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
12940 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
12950 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
12960 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
12970 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
12980 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
12990 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
129a0 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
129b0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
129c0 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
129d0 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
129e0 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
129f0 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
12a00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12a20 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
12a30 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
12a40 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
12a50 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
12a60 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
12a70 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
12a80 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
12a90 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
12aa0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
12ab0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12ac0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
12ad0 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
12ae0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
12b10 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
12b20 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
12b30 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
12b40 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
12b50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12b60 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
12b70 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
12b80 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
12b90 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
12ba0 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
12bb0 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
12bc0 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
12bd0 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
12be0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12bf0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
12c00 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
12c10 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
12c20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
12c30 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
12c40 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
12c50 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
12c60 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
12c70 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
12c80 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
12c90 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
12ca0 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
12cb0 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
12cc0 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
12cd0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
12ce0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
12cf0 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73 74  e, pSetup, &dest
12d00 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70  Queue);.  pSetup
12d10 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69  ->pNext = p;.  i
12d20 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
12d30 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
12d40 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  ery;..  /* Find 
12d50 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
12d60 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75  the Queue and ou
12d70 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f  tput that row */
12d80 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
12d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12da0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75  , OP_Rewind, iQu
12db0 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  eue, addrBreak);
12dc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12dd0 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  ;..  /* Transfer
12de0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
12df0 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43   Queue over to C
12e00 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  urrent */.  sqli
12e10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12e20 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75   OP_NullRow, iCu
12e30 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65  rrent); /* To re
12e40 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  set column cache
12e50 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
12e60 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
12e70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12e80 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65  P_Column, iQueue
12e90 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
12ea0 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29  r+1, regCurrent)
12eb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
12ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12ed0 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20  (v, OP_RowData, 
12ee0 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72 65  iQueue, regCurre
12ef0 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
12f00 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12f10 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75  OP_Delete, iQueu
12f20 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  e);..  /* Output
12f30 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
12f40 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  in Current */.  
12f50 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
12f60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
12f70 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  v);.  codeOffset
12f80 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61  (v, regOffset, a
12f90 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65  ddrCont);.  sele
12fa0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
12fb0 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c  se, p, iCurrent,
12fc0 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65  .      0, 0, pDe
12fd0 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  st, addrCont, ad
12fe0 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
12ff0 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  regLimit ){.    
13000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13010 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
13020 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
13030 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
13040 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13050 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
13060 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13070 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20  , addrCont);..  
13080 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72  /* Execute the r
13090 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
130a0 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c  taking the singl
130b0 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
130c0 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c   as.  ** the val
130d0 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72  ue for the recur
130e0 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72  sive-table. Stor
130f0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
13100 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f   the Queue..  */
13110 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
13120 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
13130 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
13140 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13150 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72   "recursive aggr
13160 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f  egate queries no
13170 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  t supported");. 
13180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70   }else{.    p->p
13190 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73  Prior = 0;.    s
131a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
131b0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
131c0 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ue);.    assert(
131d0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
131e0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
131f0 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20   pSetup;.  }..  
13200 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20  /* Keep running 
13210 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74  the loop until t
13220 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74  he Queue is empt
13230 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
13240 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f  beGoto(v, addrTo
13250 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  p);.  sqlite3Vdb
13260 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
13270 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e   addrBreak);..en
13280 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
13290 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45  uery:.  sqlite3E
132a0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
132b0 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72  arse->db, p->pOr
132c0 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72  derBy);.  p->pOr
132d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
132e0 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
132f0 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66  pLimit;.  p->pOf
13300 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
13310 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
13320 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
13330 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  T_CTE */../* For
13340 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
13350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
13360 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
13370 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13380 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
13390 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
133a0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
133b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
133c0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
133d0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
133e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
133f0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
13400 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
13410 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
13420 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  );../*.** Handle
13430 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
13440 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  e of a compound-
13450 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
13460 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a  inates from a.**
13470 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20   VALUES clause. 
13480 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69   By handling thi
13490 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  s as a special c
134a0 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65  ase, we avoid de
134b0 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c  ep.** recursion,
134c0 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74   and thus do not
134d0 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65   need to enforce
134e0 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
134f0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
13500 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53  T.** on a VALUES
13510 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42   clause..**.** B
13520 65 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63  ecause the Selec
13530 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61  t object origina
13540 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45  tes from a VALUE
13550 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28  S clause:.**   (
13560 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d  1) It has no LIM
13570 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20  IT or OFFSET.** 
13580 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20    (2) All terms 
13590 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a  are UNION ALL.**
135a0 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20     (3) There is 
135b0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
135c0 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
135d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
135e0 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
135f0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
13600 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13610 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
13620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13630 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
13640 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
13650 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
13660 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
13670 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
13680 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
13690 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
136a0 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 52 6f  Prior;.  int nRo
136b0 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20  w = 1;.  int rc 
136c0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
136d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
136e0 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20  MultiValue );.  
136f0 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
13700 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13710 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61  _Values );.    a
13720 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
13730 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d  _ALL || (p->op==
13740 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e  TK_SELECT && p->
13750 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20  pPrior==0) );.  
13760 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
13770 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  mit==0 );.    as
13780 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
13790 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
137a0 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c  t( p->pNext==0 |
137b0 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
137c0 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45  pr==p->pNext->pE
137d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
137e0 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72     if( p->pPrior
137f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
13800 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
13810 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a  or->pNext==p );.
13820 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f      p = p->pPrio
13830 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20  r;.    nRow++;. 
13840 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77 68   }while(1);.  wh
13850 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70 50  ile( p ){.    pP
13860 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
13870 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
13880 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
13890 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
138a0 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
138b0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
138c0 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 72  Prior;.    if( r
138d0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  c ) break;.    p
138e0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
138f0 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  Row;.    p = p->
13900 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pNext;.  }.  ret
13910 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13920 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13930 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
13940 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
13950 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
13960 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
13970 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
13980 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
13990 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
139a0 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
139b0 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
139c0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
139d0 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
139e0 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
139f0 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
13a00 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
13a10 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
13a20 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
13a30 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
13a40 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
13a50 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
13a60 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
13a70 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
13a80 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
13a90 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
13aa0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
13ab0 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
13ac0 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
13ad0 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
13ae0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
13af0 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
13b00 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
13b10 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
13b20 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
13b30 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
13b40 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
13b50 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
13b60 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
13b70 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
13b80 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
13b90 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
13ba0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
13bb0 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
13bc0 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
13bd0 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
13be0 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
13bf0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
13c00 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
13c10 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
13c20 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
13c30 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
13c40 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
13c50 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
13c60 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
13c70 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
13c80 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
13c90 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
13ca0 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
13cb0 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
13cc0 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
13cd0 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
13ce0 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
13cf0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
13d00 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
13d10 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
13d20 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
13d30 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
13d40 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
13d50 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
13d60 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
13d70 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
13d80 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
13d90 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
13da0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
13db0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
13dc0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
13dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13de0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
13df0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
13e00 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
13e10 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
13e20 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
13e30 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
13e40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
13e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
13e60 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
13e70 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
13e80 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
13e90 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
13ea0 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
13eb0 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
13ec0 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
13ed0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
13ee0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13ef0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
13f00 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
13f10 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
13f20 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
13f30 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
13f40 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
13f50 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
13f60 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
13f70 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
13f80 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
13f90 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
13fa0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
13fb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13fc0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
13fd0 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
13fe0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
13ff0 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
14000 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
14010 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
14020 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
14030 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
14040 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
14050 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
14060 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
14070 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
14080 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
14090 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
140a0 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
140b0 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
140c0 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
140d0 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
140e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
140f0 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
14100 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
14110 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
14120 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
14130 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
14140 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
14150 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
14160 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
14170 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
14180 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14190 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
141a0 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a  rior;.  dest = *
141b0 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
141c0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c  ior->pOrderBy ||
141d0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
141e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
141f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
14200 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  s clause should 
14210 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
14220 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
14230 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
14240 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59  y!=0 ? "ORDER BY
14250 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c  " : "LIMIT", sel
14260 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
14270 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
14280 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14290 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
142a0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
142b0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
142c0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
142d0 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65  /* The VDBE alre
142e0 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63  ady created by c
142f0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
14300 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  */..  /* Create 
14310 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
14320 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
14330 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
14340 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65  /.  if( dest.eDe
14350 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
14360 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14370 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
14380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14390 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
143a0 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44  emeral, dest.iSD
143b0 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
143c0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73  >nExpr);.    des
143d0 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
143e0 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ble;.  }..  /* S
143f0 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
14400 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  for a compound-s
14410 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
14420 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45  nates as a VALUE
14430 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  S clause..  */. 
14440 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
14450 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
14460 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
14470 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70  tiSelectValues(p
14480 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
14490 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
144a0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
144b0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
144c0 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
144d0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
144e0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
144f0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
14500 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
14510 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
14520 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14530 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
14540 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74  List );.  assert
14550 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
14560 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr==pPrior->pELi
14570 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69  st->nExpr );..#i
14580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14590 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73  T_CTE.  if( p->s
145a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
145b0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65  ursive ){.    ge
145c0 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
145d0 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c  iveQuery(pParse,
145e0 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65   p, &dest);.  }e
145f0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  lse.#endif..  /*
14600 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
14610 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
14620 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
14630 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
14640 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
14650 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
14660 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
14670 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
14680 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
14690 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
146a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
146b0 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
146c0 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
146d0 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
146e0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
146f0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
14700 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
14710 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
14720 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
14730 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
14740 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
14750 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
14760 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20   p->iLimit;.    
14770 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65    pPrior->iOffse
14780 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
14790 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
147a0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
147b0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
147c0 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
147d0 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c  fset;.      expl
147e0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
147f0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
14800 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14810 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14820 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
14830 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
14840 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
14850 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  0;.      p->pOff
14860 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
14870 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
14880 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
14890 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
148a0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
148b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  = 0;.      p->iL
148c0 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
148d0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
148e0 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
148f0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
14900 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
14910 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  {.        addr =
14920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14930 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
14940 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
14950 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
14960 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
14970 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
14980 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
14990 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d"));.        if
149a0 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ( p->iOffset ){.
149b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
149c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
149d0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a 20  P_OffsetLimit,. 
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4c             p->iL
14a00 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74  imit, p->iOffset
14a10 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  +1, p->iOffset);
14a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14a30 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e   }.      explain
14a40 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
14a50 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
14a60 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
14a70 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
14a80 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
14a90 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
14aa0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14ab0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
14ac0 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
14ad0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
14ae0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
14af0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
14b00 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
14b10 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
14b20 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
14b30 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28  tRow);.      if(
14b40 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
14b50 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
14b60 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
14b70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26  Prior->pLimit, &
14b80 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
14b90 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
14ba0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
14bb0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
14bc0 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
14bd0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
14be0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
14bf0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
14c00 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
14c10 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
14c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14c30 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14c40 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
14c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14c60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
14c70 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
14c80 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
14c90 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
14ca0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
14cb0 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
14cc0 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
14cd0 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
14ce0 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
14cf0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
14d00 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
14d10 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
14d20 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
14d30 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
14d40 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
14d50 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
14d60 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
14d70 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
14d80 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
14d90 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
14da0 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
14db0 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
14dc0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
14dd0 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
14de0 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
14df0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
14e00 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
14e10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
14e20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
14e30 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
14e40 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
14e50 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
14e60 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
14e70 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
14e80 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
14e90 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
14ea0 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
14eb0 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
14ec0 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
14ed0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14ee0 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
14ef0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
14f00 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
14f10 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
14f20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14f30 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
14f40 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
14f50 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
14f60 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
14f70 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
14f80 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
14f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
14fa0 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
14fb0 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
14fc0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
14fd0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
14fe0 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
14ff0 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
15000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15010 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
15020 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
15030 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
15040 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
15050 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
15060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15070 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
15080 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
15090 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
150a0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
150b0 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
150c0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
150d0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
150e0 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
150f0 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
15100 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
15110 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
15120 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15130 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
15140 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
15150 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15160 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
15170 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
15180 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
15190 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
151a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
151b0 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
151c0 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
151d0 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  Tab);.      expl
151e0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
151f0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
15200 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
15210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
15220 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
15230 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
15240 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
15250 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
15260 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15270 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15280 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
15290 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
152a0 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
152b0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
152c0 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
152d0 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
152e0 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
152f0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
15300 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
15310 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
15320 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
15330 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
15340 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
15350 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
15360 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
15370 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
15380 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
15390 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
153a0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
153b0 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
153c0 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78  t = op;.      ex
153d0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
153e0 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
153f0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
15400 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15410 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
15420 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
15430 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
15450 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
15460 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
15470 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
15480 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
15490 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
154a0 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
154b0 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
154c0 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
154d0 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
154e0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
154f0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
15500 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
15510 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
15520 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
15530 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
15540 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
15550 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
15560 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
15570 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
15580 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
15590 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
155a0 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
155b0 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
155c0 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
155d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
155e0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
155f0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
15600 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
15610 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
15620 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
15630 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
15640 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
15650 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ffset = 0;..    
15660 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
15670 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
15680 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
15690 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
156a0 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
156b0 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
156c0 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
156d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
156e0 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
156f0 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
15700 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
15710 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
15720 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est!=priorOp ){.
15730 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
15740 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
15750 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
15760 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
15770 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
15780 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15790 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
157a0 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
157b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
157c0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
157d0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
157e0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
157f0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
15800 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15810 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
15820 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20  onTab, iBreak); 
15830 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15840 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
15850 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
15860 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
15870 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
15880 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15890 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20  unionTab,.      
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
158c0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
158d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
158e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
158f0 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
15900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15910 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15920 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
15930 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15940 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
15950 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15960 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
15970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15990 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
159a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
159b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
159c0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
159d0 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
159e0 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
159f0 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
15a00 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
15a10 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
15a20 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
15a30 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
15a40 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
15a50 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
15a60 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
15a70 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
15a80 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
15a90 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
15aa0 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
15ab0 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
15ac0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
15ad0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15ae0 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
15af0 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
15b00 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
15b10 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
15b20 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
15b30 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
15b40 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
15b50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
15b60 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
15b70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
15b80 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
15b90 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
15ba0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
15bb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
15bc0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
15bd0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
15be0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
15bf0 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
15c00 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
15c10 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
15c20 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
15c30 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
15c40 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
15c50 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
15c60 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
15c70 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
15c80 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
15c90 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
15ca0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
15cb0 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
15cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
15cd0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
15ce0 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
15cf0 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
15d00 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15d10 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
15d20 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15d30 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15d40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15d50 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
15d60 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
15d70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
15d80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
15d90 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
15da0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15db0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
15dc0 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
15dd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
15de0 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
15df0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15e00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15e10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15e20 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
15e30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
15e40 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
15e50 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
15e60 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
15e70 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
15e80 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
15e90 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
15ea0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
15eb0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
15ec0 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
15ed0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
15ee0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
15ef0 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
15f00 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
15f10 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
15f20 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
15f30 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
15f40 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
15f50 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
15f60 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
15f70 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
15f80 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
15f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15fa0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
15fb0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
15fc0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
15fd0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
15fe0 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
15ff0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
16000 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
16010 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
16020 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
16030 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
16040 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
16050 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
16060 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
16070 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
16080 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
16090 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
160a0 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
160b0 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
160c0 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
160d0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
160e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
160f0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
16100 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
16110 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16120 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
16130 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16140 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
16150 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
16160 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
16170 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
16180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16190 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
161a0 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
161b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
161c0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
161d0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
161e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
161f0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
16200 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
16210 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72 31  owData, tab1, r1
16220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16230 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
16240 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
16250 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
16260 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16270 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16280 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16290 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
162a0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
162b0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61  op(pParse, p, ta
162c0 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b1,.            
162d0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
162e0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
162f0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
16300 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16310 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
16320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
16340 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
16350 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16360 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16370 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16380 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
16390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
163a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
163b0 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
163c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
163d0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
163e0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
163f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16400 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d   }..  explainCom
16410 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
16420 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
16430 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  b2, p->op!=TK_AL
16440 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  L);..  /* Comput
16450 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
16460 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
16470 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
16480 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
16490 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
164a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
164b0 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
164c0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
164d0 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
164e0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
164f0 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
16500 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
16510 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
16520 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
16530 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
16540 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
16550 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
16560 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
16570 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
16580 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
16590 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
165a0 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
165b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
165c0 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
165d0 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
165e0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
165f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
16600 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
16610 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
16640 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
16650 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
16660 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
16670 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
16680 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
16690 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
166a0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
166b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
166c0 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
166d0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
166e0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
166f0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
16700 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
16710 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
16720 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
16730 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
16760 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
16770 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
16780 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
16790 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
167a0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
167b0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
167c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
167d0 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
167e0 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
167f0 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
16800 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
16810 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
16820 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
16830 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
16840 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
16850 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
16860 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
16870 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
16880 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
16890 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
168a0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
168b0 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
168c0 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
168d0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
168e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
168f0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
16900 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
16910 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
16920 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
16930 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
16940 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
16950 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
16960 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
16970 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
16980 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
16990 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
169a0 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
169b0 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
169c0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
169d0 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
169e0 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
169f0 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
16a00 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
16a10 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
16a20 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
16a30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
16a40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
16a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16a60 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
16a70 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
16a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16a90 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
16aa0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
16ab0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
16ac0 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
16af0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
16b00 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
16b10 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
16b20 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
16b30 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
16b40 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
16b50 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
16b60 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
16b70 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
16b80 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
16b90 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
16ba0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
16bb0 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
16bc0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
16bd0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
16be0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
16bf0 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
16c00 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
16c10 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
16c20 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
16c30 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
16c40 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
16c50 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
16c60 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
16c70 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
16c80 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
16c90 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
16ca0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
16cb0 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
16cc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16cd0 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
16ce0 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
16cf0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
16d00 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
16d10 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
16d20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16d30 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
16d40 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
16d50 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
16d60 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
16d70 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
16d80 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
16d90 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
16da0 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
16db0 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
16dc0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
16dd0 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
16de0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
16df0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
16e00 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
16e10 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
16e20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
16e30 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
16e40 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
16e50 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
16e60 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
16e70 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
16e80 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
16e90 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
16ea0 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
16eb0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
16ec0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
16ed0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
16ee0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
16ef0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
16f00 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
16f10 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
16f20 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
16f30 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
16f40 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
16f50 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
16f60 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
16f70 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
16f80 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
16f90 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
16fa0 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
16fb0 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
16fc0 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
16fd0 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
16fe0 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
16ff0 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
17000 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
17010 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
17020 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
17030 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
17040 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
17050 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
17060 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
17070 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
17080 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
17090 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
170a0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
170b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
170d0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
170e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
170f0 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
17100 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
17110 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
17120 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
17130 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
17140 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
17150 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
17160 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
17170 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
17180 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
17190 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
171a0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
171b0 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
171c0 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
171d0 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
171e0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
171f0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
17200 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
17210 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
17220 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
17230 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
17240 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
17250 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
17260 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
17270 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
17280 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
17290 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
172a0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
172b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
172c0 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
172d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
172e0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
172f0 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
17300 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
17310 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
17320 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
17330 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
17340 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
17350 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
17360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17370 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
17380 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
17390 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
173a0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
173b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
173c0 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
173d0 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
173e0 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
17410 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
17420 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
17430 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
17440 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17450 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32  OP_Jump, addr2+2
17460 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64  , iContinue, add
17470 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  r2+2); VdbeCover
17480 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
17490 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
174a0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
174b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
174c0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
174d0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
174e0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
174f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17500 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17510 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
17520 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
17530 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
17540 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
17550 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
17560 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
17570 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
17580 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
17590 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
175a0 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
175b0 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
175c0 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
175d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
175e0 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
175f0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
17600 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
17610 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
17620 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
17630 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
17640 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
17650 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
17660 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17670 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
17680 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
17690 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
176a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
176b0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
176c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
176d0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
176e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
176f0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
17700 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
17710 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
17720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17730 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
17740 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
17750 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
17760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17770 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
17780 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
17790 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
177a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
177b0 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
177c0 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
177d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
177e0 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
177f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17800 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17810 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
17820 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
17830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
17840 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
17850 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
17860 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
17870 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
17880 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
17890 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
178a0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
178b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
178c0 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20  In->nSdst>1 );. 
178d0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
178e0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
178f0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
17900 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17910 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
17920 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
17930 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20  nSdst, .        
17940 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
17950 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  fSdst, pIn->nSds
17960 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17970 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
17980 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
17990 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
179a0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
179b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
179c0 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
179d0 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
179e0 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20  Parm, r1,.      
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c       pIn->iSdst,
17a10 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17a20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17a30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17a40 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
17a50 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
17a60 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
17a70 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
17a80 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
17a90 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
17aa0 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
17ab0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
17ac0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
17ad0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
17ae0 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
17af0 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
17b00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17b10 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
17b20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
17b30 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65  dst==1 || pParse
17b40 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73  ->nErr>0 );  tes
17b50 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
17b60 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  t!=1 );.      sq
17b70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
17b80 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17b90 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  Sdst, pDest->iSD
17ba0 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
17bb0 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
17bc0 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
17bd0 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
17be0 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
17bf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
17c00 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
17c10 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
17c20 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65  Y */..    /* The
17c30 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
17c40 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
17c50 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  e of registers. 
17c60 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
17c70 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20  t pDest->iSdst. 
17c80 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75   Then the co-rou
17c90 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20  tine yields..   
17ca0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
17cb0 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  _Coroutine: {.  
17cc0 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69      if( pDest->i
17cd0 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sdst==0 ){.     
17ce0 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
17cf0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17d00 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  Range(pParse, pI
17d10 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17d20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20     pDest->nSdst 
17d30 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20  = pIn->nSdst;.  
17d40 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
17d50 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
17d60 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
17d70 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  st, pDest->iSdst
17d80 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17da0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
17db0 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
17dc0 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
17dd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17de0 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
17df0 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
17e00 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
17e10 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
17e20 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
17e30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
17e40 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
17e50 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
17e60 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
17e70 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
17e80 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
17e90 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
17ea0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
17eb0 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
17ec0 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
17ed0 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
17ee0 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
17ef0 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
17f00 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
17f10 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
17f20 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
17f30 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
17f40 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
17f50 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
17f60 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
17f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
17f80 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
17f90 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
17fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17fb0 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
17fc0 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  w, pIn->iSdst, p
17fd0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
17fe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17ff0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
18000 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
18010 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
18020 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18030 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a     }.  }..  /* J
18040 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
18050 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
18060 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
18070 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
18080 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
18090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
180a0 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
180b0 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
180c0 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
180d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
180e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
180f0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
18100 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
18110 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
18120 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
18130 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18140 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
18150 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a  rn, regReturn);.
18160 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
18170 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61  }../*.** Alterna
18180 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65  tive compound se
18190 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61  lect code genera
181a0 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68  tor for cases wh
181b0 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  en there.** is a
181c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
181d0 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  e..**.** We assu
181e0 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  me a query of th
181f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
18200 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65  :.**.**      <se
18210 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f  lectA>  <operato
18220 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f  r>  <selectB>  O
18230 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79  RDER BY <orderby
18240 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65  list>.**.** <ope
18250 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66  rator> is one of
18260 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f   UNION ALL, UNIO
18270 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
18280 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64  TERSECT.  The id
18290 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65  ea.** is to code
182a0 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20   both <selectA> 
182b0 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69  and <selectB> wi
182c0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
182d0 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d  clause as.** co-
182e0 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20  routines.  Then 
182f0 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  run the co-routi
18300 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20  nes in parallel 
18310 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
18320 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68  sults.** into th
18330 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64  e output.  In ad
18340 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77  dition to the tw
18350 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61  o coroutines (ca
18360 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64  lled selectA and
18370 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65  .** selectB) the
18380 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74  re are 7 subrout
18390 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  ines:.**.**    o
183a0 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utA:    Move the
183b0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
183c0 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65  electA coroutine
183d0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
183e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
183f0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
18400 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  query..**.**    
18410 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68  outB:    Move th
18420 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
18430 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e  selectB coroutin
18440 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
18450 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
18460 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
18470 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67   query.  (Only g
18480 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49  enerated for UNI
18490 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ON and.**       
184a0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e        UNION ALL.
184b0 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53    EXCEPT and INS
184c0 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75  ERTSECT never ou
184d0 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a  tput a row that.
184e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  **             a
184f0 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42  ppears only in B
18500 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42  .).**.**    AltB
18510 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
18520 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
18530 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
18540 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a  nes and A<B..**.
18550 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43  **    AeqB:    C
18560 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
18570 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
18580 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
18590 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  d A==B..**.**   
185a0 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AgtB:    Called
185b0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
185c0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
185d0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42  routines and A>B
185e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  ..**.**    EofA:
185f0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
18600 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
18610 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a  d from selectA..
18620 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20  **.**    EofB:  
18630 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
18640 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
18650 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a  from selectB..**
18660 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
18670 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
18680 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75  tter five subrou
18690 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20  tines depend on 
186a0 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61  which .** <opera
186b0 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a  tor> is used:.**
186c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
186d0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20     UNION ALL    
186e0 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20       UNION      
186f0 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20        EXCEPT    
18700 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a        INTERSECT.
18710 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
18720 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
18730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
18740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
18750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
18760 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74  **   AltB:   out
18770 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
18780 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
18790 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
187a0 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20      nextA.**.** 
187b0 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20    AeqB:   outA, 
187c0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
187d0 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20  xtA             
187e0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75  nextA         ou
187f0 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20  tA, nextA.**.** 
18800 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20    AgtB:   outB, 
18810 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
18820 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
18830 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20  nextB           
18840 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45   nextB.**.**   E
18850 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  ofA:   outB, nex
18860 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
18870 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c  xtB          hal
18880 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61  t             ha
18890 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a  lt.**.**   EofB:
188a0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
188b0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
188c0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
188d0 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a  A         halt.*
188e0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42  *.** In the AltB
188f0 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42  , AeqB, and AgtB
18900 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e   subroutines, an
18910 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77   EOF on A follow
18920 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75  ing nextA.** cau
18930 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ses an immediate
18940 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e   jump to EofA an
18950 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f  d an EOF on B fo
18960 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61  llowing nextB ca
18970 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64  uses.** an immed
18980 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
18990 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20  B.  Within EofA 
189a0 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f  and EofB, and EO
189b0 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a  F on entry or.**
189c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58   following nextX
189d0 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74   causes a jump t
189e0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
189f0 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69   select processi
18a00 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ng..**.** Duplic
18a10 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74  ate removal in t
18a20 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  he UNION, EXCEPT
18a30 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
18a40 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64  cases is handled
18a50 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f  .** within the o
18a60 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
18a70 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72  .  The regPrev r
18a80 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64  egister set hold
18a90 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  s the previously
18aa0 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65  .** output value
18ab0 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20  .  A comparison 
18ac0 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20  is made against 
18ad0 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74  this value and t
18ae0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20  he output.** is 
18af0 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e  skipped if the n
18b00 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c  ext results woul
18b10 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
18b20 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a   the previous..*
18b30 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
18b40 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20  ntation plan is 
18b50 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
18b60 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
18b70 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62  and seven.** sub
18b80 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20  routines first, 
18b90 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e  then put the con
18ba0 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68  trol logic at th
18bb0 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20  e bottom.  Like 
18bc0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
18bd0 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a       goto Init.*
18be0 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75  *     coA: corou
18bf0 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75  tine for left qu
18c00 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63  ery (A).**     c
18c10 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oB: coroutine fo
18c20 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42  r right query (B
18c30 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75  ).**    outA: ou
18c40 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
18c50 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75  A.**    outB: ou
18c60 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
18c70 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49  B (UNION and UNI
18c80 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20  ON ALL only).** 
18c90 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20     EofA: ....** 
18ca0 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20     EofB: ....** 
18cb0 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AltB: ....** 
18cc0 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20     AeqB: ....** 
18cd0 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AgtB: ....** 
18ce0 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c     Init: initial
18cf0 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65  ize coroutine re
18d00 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20  gisters.**      
18d10 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a      yield coA.**
18d20 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
18d30 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a  (A) goto EofA.**
18d40 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
18d50 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coB.**          
18d60 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45  if eof(B) goto E
18d70 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20  ofB.**    Cmpr: 
18d80 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20  Compare A, B.** 
18d90 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c           Jump Al
18da0 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a  tB, AeqB, AgtB.*
18db0 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a  *     End: ....*
18dc0 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74  *.** We call Alt
18dd0 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45  B, AeqB, AgtB, E
18de0 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73  ofA, and EofB "s
18df0 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20  ubroutines" but 
18e00 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  they are not.** 
18e10 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20  actually called 
18e20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20  using Gosub and 
18e30 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75  they do not Retu
18e40 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f  rn.  EofA and Eo
18e50 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c  fB loop.** until
18e60 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68   all data is exh
18e70 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70  austed then jump
18e80 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61   to the "end" la
18e90 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c  be.  AltB, AeqB,
18ea0 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d  .** and AgtB jum
18eb0 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f  p to either L2 o
18ec0 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41  r to one of EofA
18ed0 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66   or EofB..*/.#if
18ee0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18ef0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
18f00 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
18f10 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
18f20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18f30 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
18f40 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18f50 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
18f60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
18f70 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
18f80 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
18f90 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
18fa0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
18fb0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
18fc0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
18fd0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
18fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
18ff0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53   counters */.  S
19000 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
19010 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
19020 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
19030 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
19040 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
19050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
19060 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
19070 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
19080 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20  ectDest destA;  
19090 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
190a0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
190b0 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  A */.  SelectDes
190c0 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20  t destB;     /* 
190d0 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
190e0 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20  coroutine B */. 
190f0 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20   int regAddrA;  
19100 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
19110 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
19120 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
19130 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  e */.  int regAd
19140 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drB;         /* 
19150 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
19160 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f   for select-B co
19170 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19180 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
19190 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
191a0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
191b0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
191c0 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
191d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
191e0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
191f0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19200 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
19210 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
19220 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
19230 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
19240 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
19250 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
19260 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
19270 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
19280 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
19290 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
192a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
192b0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
192c0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
192d0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
192e0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
192f0 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
19300 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
19310 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
19320 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
19330 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
19340 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
19350 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
19360 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  int addrEofA_noB
19370 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61  ;     /* Alterna
19380 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42  te addrEofA if B
19390 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   is uninitialize
193a0 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  d */.  int addrE
193b0 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofB;         /* 
193c0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
193d0 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65  elect-B-exhauste
193e0 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
193f0 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20    int addrAltB; 
19400 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
19410 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75  ss of the A<B su
19420 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
19430 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20  t addrAeqB;     
19440 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19450 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f  f the A==B subro
19460 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19470 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20  ddrAgtB;        
19480 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
19490 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e  he A>B subroutin
194a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  e */.  int regLi
194b0 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitA;        /* 
194c0 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
194d0 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
194e0 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20   int regLimitB; 
194f0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
19500 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
19510 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
19520 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
19530 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72   /* A range of r
19540 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
19550 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
19560 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c   */.  int savedL
19570 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
19580 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
19590 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  >iLimit */.  int
195a0 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20   savedOffset;   
195b0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
195c0 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20  e of p->iOffset 
195d0 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d  */.  int labelCm
195e0 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  pr;        /* La
195f0 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72  bel for the star
19600 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61  t of the merge a
19610 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e  lgorithm */.  in
19620 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20  t labelEnd;     
19630 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
19640 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
19650 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73  overall SELECT s
19660 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  tmt */.  int add
19670 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  r1;            /
19680 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  * Jump instructi
19690 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74  ons that get ret
196a0 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e  argetted */.  in
196b0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
196c0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
196d0 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20  _ALL, TK_UNION, 
196e0 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e  TK_EXCEPT, TK_IN
196f0 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79  TERSECT */.  Key
19700 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20  Info *pKeyDup = 
19710 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  0; /* Comparison
19720 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
19730 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   duplicate remov
19740 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  al */.  KeyInfo 
19750 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a  *pKeyMerge;   /*
19760 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
19770 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67  rmation for merg
19780 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ing rows */.  sq
19790 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
197a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
197b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
197c0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
197d0 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
197e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
197f0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
19800 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19810 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
19820 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19830 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  e */.  int *aPer
19840 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  mute;        /* 
19850 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44  Mapping from ORD
19860 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72  ER BY terms to r
19870 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
19880 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
19890 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
198a0 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20  .  int iSub1;   
198b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
198c0 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  id of left-hand 
198d0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
198e0 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20  Sub2;           
198f0 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69   /* EQP id of ri
19900 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  ght-hand query *
19910 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
19920 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  rt( p->pOrderBy!
19930 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19940 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a  pKeyDup==0 ); /*
19950 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20   "Managed" code 
19960 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63  needs this.  Tic
19970 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20  ket #3382. */.  
19980 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
19990 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
199a0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
199b0 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
199c0 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20   Already thrown 
199d0 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42  the error if VDB
199e0 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a  E alloc failed *
199f0 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  /.  labelEnd = s
19a00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19a10 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43  bel(v);.  labelC
19a20 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
19a30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
19a40 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74  .  /* Patch up t
19a50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19a60 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  se.  */.  op = p
19a70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72  ->op;  .  pPrior
19a80 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
19a90 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
19aa0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
19ab0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
19ac0 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72  OrderBy;.  asser
19ad0 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  t( pOrderBy );. 
19ae0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
19af0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
19b00 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
19b10 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
19b20 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
19b30 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
19b40 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
19b50 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
19b60 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
19b70 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
19b80 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
19b90 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19ba0 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
19bb0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
19bc0 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
19bd0 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
19be0 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
19bf0 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
19c00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
19c10 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
19c20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19c30 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
19c40 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
19c50 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c  j<nOrderBy; j++,
19c60 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19c70 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
19c80 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
19c90 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
19ca0 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
19cb0 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62  rderByCol==i ) b
19cc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19cd0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
19ce0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
19cf0 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
19d00 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
19d10 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
19d20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
19d30 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19d40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
19d50 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
19d60 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
19d70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
19d80 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
19d90 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
19da0 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
19db0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
19dc0 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
19dd0 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
19de0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
19df0 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
19e00 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
19e10 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
19e20 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
19e30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
19e40 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
19e50 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
19e60 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
19e70 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
19e80 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
19e90 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
19ea0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
19eb0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
19ec0 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
19ed0 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
19ee0 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
19ef0 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
19f00 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
19f10 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
19f20 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
19f30 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
19f40 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
19f50 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
19f60 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
19f70 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
19f80 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
19f90 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
19fa0 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
19fb0 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
19fc0 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65  zeof(int)*(nOrde
19fd0 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28  rBy + 1));.  if(
19fe0 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
19ff0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a000 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1a010 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20    aPermute[0] = 
1a020 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f  nOrderBy;.    fo
1a030 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=1, pItem=pOr
1a040 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72  derBy->a; i<=nOr
1a050 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
1a060 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
1a070 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1a080 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
1a090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1a0a0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1a0b0 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
1a0c0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1a0d0 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
1a0e0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1a0f0 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
1a100 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
1a110 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1a120 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
1a130 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  , p, 1);.  }else
1a140 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
1a150 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
1a160 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
1a170 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
1a180 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1a190 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1a1a0 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
1a1b0 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
1a1c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1a1d0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
1a1e0 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
1a1f0 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
1a200 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
1a210 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
1a220 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
1a230 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
1a240 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
1a250 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
1a260 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
1a270 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
1a280 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1a290 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
1a2a0 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
1a2b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1a2c0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1a2d0 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
1a2e0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
1a2f0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
1a300 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
1a310 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
1a320 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1a330 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
1a340 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
1a350 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
1a360 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
1a370 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
1a380 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a390 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
1a3a0 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
1a3b0 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
1a3c0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
1a3d0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
1a3e0 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
1a3f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
1a400 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
1a410 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
1a420 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1a430 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a440 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
1a450 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
1a460 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
1a470 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
1a480 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
1a490 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
1a4a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a4b0 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
1a4c0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
1a4d0 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
1a4e0 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
1a4f0 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
1a500 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e   0;.  pPrior->pN
1a510 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
1a520 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1a530 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
1a540 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
1a550 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
1a560 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
1a570 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
1a580 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1a590 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
1a5a0 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
1a5b0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1a5c0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1a5d0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
1a5e0 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
1a5f0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
1a600 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
1a610 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
1a620 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
1a630 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
1a640 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
1a650 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
1a660 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
1a670 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1a680 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a690 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
1a6a0 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
1a6b0 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
1a6f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a700 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
1a710 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
1a720 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
1a730 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
1a740 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
1a750 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
1a760 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
1a770 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
1a780 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
1a790 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1a7a0 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
1a7b0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
1a7c0 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
1a7d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1a7e0 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
1a7f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
1a800 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
1a810 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
1a820 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a830 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1a840 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
1a850 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
1a860 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
1a870 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
1a880 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
1a890 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1a8a0 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
1a8b0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1a8c0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1a8d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1a8e0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
1a8f0 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
1a900 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
1a910 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
1a920 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  /.  addrSelectA 
1a930 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1a940 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
1a950 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
1a960 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1a970 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
1a980 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61  , regAddrA, 0, a
1a990 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56  ddrSelectA);.  V
1a9a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a9b0 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
1a9c0 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
1a9d0 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
1a9e0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
1a9f0 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
1aa00 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
1aa10 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1aa20 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
1aa30 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
1aa40 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1aa50 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41 29  ine(v, regAddrA)
1aa60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
1aa70 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
1aa80 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1aa90 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1aaa0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1aab0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
1aac0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
1aad0 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
1aae0 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
1aaf0 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
1ab00 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1ab10 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
1ab20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab30 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
1ab40 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1ab50 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42  , 0, addrSelectB
1ab60 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1ab70 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45  ((v, "right SELE
1ab80 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
1ab90 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
1aba0 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
1abb0 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
1abc0 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
1abd0 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
1abe0 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c  et = 0;  .  expl
1abf0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
1ac00 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
1ac10 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
1ac20 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1ac30 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
1ac40 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
1ac50 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
1ac60 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
1ac70 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
1ac80 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1ac90 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  (v, regAddrB);..
1aca0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1acb0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1acc0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1acd0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
1ace0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1acf0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1ad00 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1ad10 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1ad20 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1ad30 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
1ad40 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
1ad50 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
1ad60 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1ad70 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad90 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
1ada0 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1adc0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1add0 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a  belEnd);.  .  /*
1ade0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1adf0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1ae00 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1ae10 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a  row of the B.  *
1ae20 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1ae30 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1ae40 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1ae50 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  select..  */.  i
1ae60 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1ae70 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1ae80 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1ae90 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1aea0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29   routine for B")
1aeb0 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20  );.    addrOutB 
1aec0 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1aed0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1aee0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1aef0 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70      p, &destB, p
1af00 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20  Dest, regOutB,. 
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1af30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
1af40 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  .  sqlite3KeyInf
1af50 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b  oUnref(pKeyDup);
1af60 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1af70 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1af80 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1af90 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1afa0 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
1afb0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1afc0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
1afd0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1afe0 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
1aff0 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
1b000 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1b010 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72  rEofA_noB = addr
1b020 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b  EofA = labelEnd;
1b030 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
1b040 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1b050 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
1b060 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1b070 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
1b080 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b090 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1b0a0 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
1b0b0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73  addrEofA_noB = s
1b0c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b0d0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1b0e0 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64  gAddrB, labelEnd
1b0f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b110 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1b120 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1b130 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b140 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
1b150 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
1b160 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1b170 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
1b180 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1b190 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  w);.  }..  /* Ge
1b1a0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1b1b0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1b1c0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1b1d0 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
1b1e0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1b1f0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1b200 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
1b210 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1b220 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1b230 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
1b240 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
1b250 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
1b260 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1b270 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
1b280 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
1b290 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
1b2a0 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
1b2b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
1b2c0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1b2d0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
1b2e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b2f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1b300 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1b310 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1b320 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b330 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1b340 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65   labelEnd); Vdbe
1b350 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1b360 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1b370 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  (v, addrEofB);. 
1b380 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1b390 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1b3a0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
1b3b0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1b3c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
1b3d0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1b3e0 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
1b3f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b400 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1b410 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1b420 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b430 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b440 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1b450 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1b460 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1b470 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1b480 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1b490 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b4a0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1b4b0 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
1b4c0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1b4d0 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1b4e0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
1b4f0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
1b500 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1b510 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1b520 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
1b530 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
1b540 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1b550 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
1b560 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1b570 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
1b580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b590 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b5a0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1b5b0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1b5c0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1b5d0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1b5e0 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
1b5f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b600 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1b610 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
1b620 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1b630 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
1b640 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1b650 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
1b660 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1b670 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
1b680 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1b690 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
1b6a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b6b0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1b6c0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1b6d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1b6e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b6f0 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1b700 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1b710 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1b720 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1b730 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1b740 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
1b750 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
1b760 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
1b770 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1b780 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1b790 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
1b7a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b7b0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1b7c0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
1b7d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b7e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b7f0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1b800 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1b810 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1b820 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
1b830 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
1b840 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
1b850 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b860 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1b870 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
1b880 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1b890 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
1b8a0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
1b8b0 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
1b8c0 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
1b8d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1b8e0 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
1b8f0 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
1b900 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1b930 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
1b940 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
1b950 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1b960 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
1b970 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b980 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
1b990 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
1b9a0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
1b9b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b9c0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1b9d0 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
1b9e0 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
1b9f0 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
1ba00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1ba10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1ba20 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
1ba30 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
1ba40 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1ba50 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1ba60 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
1ba70 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
1ba80 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1ba90 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1baa0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
1bab0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1bac0 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
1bad0 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
1bae0 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
1baf0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
1bb00 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
1bb10 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
1bb20 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
1bb30 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
1bb40 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
1bb50 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c  ies ****/.  expl
1bb60 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
1bb70 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
1bb80 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20  1, iSub2, 0);.  
1bb90 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
1bba0 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  Err!=0;.}.#endif
1bbb0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1bbc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1bbd0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1bbe0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1bbf0 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e  W)../* An instan
1bc00 63 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43  ce of the SubstC
1bc10 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65  ontext object de
1bc20 73 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74  scribes an subst
1bc30 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20  itution edit.** 
1bc40 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
1bc50 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e  on a parse tree.
1bc60 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72  .**.** All refer
1bc70 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
1bc80 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65   in table iTable
1bc90 20 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61   are to be repla
1bca0 63 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e  ced by correspon
1bcb0 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ding.** expressi
1bcc0 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a  ons in pEList..*
1bcd0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1bce0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a   SubstContext {.
1bcf0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bd10 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1bd20 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
1bd30 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
1bd40 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66    /* Replace ref
1bd50 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
1bd60 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1bd70 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20  NewTable;       
1bd80 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c       /* New tabl
1bd90 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
1bda0 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20  t isLeftJoin;   
1bdb0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54          /* Add T
1bdc0 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70  K_IF_NULL_ROW op
1bdd0 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65  codes on each re
1bde0 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45  placement */.  E
1bdf0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1be00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c           /* Repl
1be10 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69  acement expressi
1be20 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f  ons */.} SubstCo
1be30 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61  ntext;../* Forwa
1be40 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
1be50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1be60 75 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62  ubstExprList(Sub
1be70 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72  stContext*, Expr
1be80 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1be90 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1bea0 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53  SubstContext*, S
1beb0 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  elect*, int);../
1bec0 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
1bed0 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
1bee0 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
1bef0 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1bf00 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
1bf10 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
1bf20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
1bf30 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
1bf40 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
1bf50 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
1bf60 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
1bf70 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
1bf80 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
1bf90 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
1bfa0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
1bfb0 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
1bfc0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
1bfd0 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
1bfe0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
1bff0 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
1c000 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
1c010 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
1c020 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1c030 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
1c040 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
1c050 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
1c060 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
1c070 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
1c080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1c090 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
1c0a0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
1c0b0 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
1c0c0 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
1c0d0 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
1c0e0 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
1c0f0 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
1c100 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1c110 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
1c120 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
1c130 75 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73  ubstExpr(.  Subs
1c140 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1c150 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  ,  /* Descriptio
1c160 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1c170 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ution */.  Expr 
1c180 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
1c190 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
1c1a0 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
1c1b0 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1c1c0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1c1d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78  turn 0;.  if( Ex
1c1e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c1f0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
1c200 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  ).   && pExpr->i
1c210 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
1c220 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20  pSubst->iTable. 
1c230 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   ){.    pExpr->i
1c240 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c250 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1c260 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  le;.  }.  if( pE
1c270 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1c280 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1c290 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61  ble==pSubst->iTa
1c2a0 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
1c2b0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1c2c0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1c2d0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1c2e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
1c2f0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
1c300 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70   Expr *pCopy = p
1c310 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  Subst->pEList->a
1c320 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1c330 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
1c340 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20  pr ifNullRow;.  
1c350 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1c360 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26  st->pEList!=0 &&
1c370 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1c380 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e  pSubst->pEList->
1c390 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
1c3a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1c3b0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
1c3c0 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
1c3d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1c3e0 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70  xprIsVector(pCop
1c3f0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  y) ){.        sq
1c400 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
1c410 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72  Msg(pSubst->pPar
1c420 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20  se, pCopy);.    
1c430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c440 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c450 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64  Subst->pParse->d
1c460 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
1c470 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69  Subst->isLeftJoi
1c480 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d  n && pCopy->op!=
1c490 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
1c4a0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69         memset(&i
1c4b0 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a  fNullRow, 0, siz
1c4c0 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b  eof(ifNullRow));
1c4d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c  .          ifNul
1c4e0 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f  lRow.op = TK_IF_
1c4f0 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20  NULL_ROW;.      
1c500 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c      ifNullRow.pL
1c510 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20  eft = pCopy;.   
1c520 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1c530 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74  .iTable = pSubst
1c540 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->iNewTable;.   
1c550 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26         pCopy = &
1c560 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20  ifNullRow;.     
1c570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
1c580 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
1c590 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29  up(db, pCopy, 0)
1c5a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1c5b0 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73  ew && pSubst->is
1c5c0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
1c5d0 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
1c5e0 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43  perty(pNew, EP_C
1c5f0 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  anBeNull);.     
1c600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c610 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61 73   pNew && ExprHas
1c620 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
1c630 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
1c640 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69           pNew->i
1c650 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c660 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
1c670 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  inTable;.       
1c680 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1c690 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d  ty(pNew, EP_From
1c6a0 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  Join);.        }
1c6b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c6c0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1c6d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
1c6e0 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
1c6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1c700 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70  se{.    if( pExp
1c710 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c  r->op==TK_IF_NUL
1c720 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e  L_ROW && pExpr->
1c730 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e  iTable==pSubst->
1c740 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
1c750 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
1c760 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c  pSubst->iNewTabl
1c770 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78  e;.    }.    pEx
1c780 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73  pr->pLeft = subs
1c790 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1c7a0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1c7b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
1c7c0 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1c7d0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1c7e0 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
1c7f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c800 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1c810 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1c820 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45 78  lect(pSubst, pEx
1c830 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31  pr->x.pSelect, 1
1c840 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c850 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1c860 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  t(pSubst, pExpr-
1c870 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
1c880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
1c890 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
1c8a0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1c8b0 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1c8c0 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73   *pSubst, /* Des
1c8d0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1c8e0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1c8f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1c900 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t       /* List 
1c910 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
1c920 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1c930 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20  stitutes */.){. 
1c940 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1c950 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1c960 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1c970 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1c980 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1c990 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1c9a0 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73  xpr(pSubst, pLis
1c9b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
1c9c0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1c9d0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
1c9e0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1c9f0 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69  Subst, /* Descri
1ca00 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1ca10 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53  stitution */.  S
1ca20 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1ca30 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
1ca40 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
1ca50 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1ca60 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
1ca70 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20   doPrior        
1ca80 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74     /* Do substit
1ca90 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f  utes on p->pPrio
1caa0 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72  r too */.){.  Sr
1cab0 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
1cac0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1cad0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1cae0 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
1caf0 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20  eturn;.  do{.   
1cb00 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1cb10 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74  Subst, p->pEList
1cb20 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
1cb30 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e  List(pSubst, p->
1cb40 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
1cb50 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1cb60 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  bst, p->pOrderBy
1cb70 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
1cb80 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  g = substExpr(pS
1cb90 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67  ubst, p->pHaving
1cba0 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  );.    p->pWhere
1cbb0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1cbc0 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  bst, p->pWhere);
1cbd0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  .    pSrc = p->p
1cbe0 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Src;.    assert(
1cbf0 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20   pSrc!=0 );.    
1cc00 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1cc10 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1cc20 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1cc30 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1cc40 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1cc50 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31  Item->pSelect, 1
1cc60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
1cc70 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1cc80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73   ){.        subs
1cc90 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1cca0 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
1ccb0 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  cArg);.      }. 
1ccc0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64     }.  }while( d
1ccd0 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70  oPrior && (p = p
1cce0 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a  ->pPrior)!=0 );.
1ccf0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1cd00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1cd10 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1cd20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1cd30 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1cd40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1cd50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1cd60 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1cd70 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1cd80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1cd90 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1cda0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1cdb0 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1cdc0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1cdd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1cde0 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1cdf0 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1ce00 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1ce10 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1ce20 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1ce30 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1ce40 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1ce50 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1ce60 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1ce70 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1ce80 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1ce90 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1cea0 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1ceb0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1cec0 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1ced0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1cee0 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1cef0 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1cf00 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1cf10 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1cf20 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1cf30 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1cf40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cf50 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1cf60 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1cf70 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1cf80 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1cf90 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1cfa0 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1cfb0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1cfc0 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1cfd0 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1cfe0 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1cff0 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1d000 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1d010 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d020 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1d030 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1d040 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1d050 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1d060 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1d070 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1d080 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1d090 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1d0a0 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1d0b0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1d0c0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1d0d0 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1d0e0 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1d0f0 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1d100 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1d110 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1d120 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1d130 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1d140 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1d150 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1d160 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1d170 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1d180 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1d190 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
1d1a0 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
1d1b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1d1c0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1d1d0 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
1d1e0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1d1f0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1d200 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
1d210 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
1d220 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1d230 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1d240 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f 75 74   or (2a) the out
1d250 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1d260 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  a join.**       
1d270 20 61 6e 64 20 28 32 62 29 20 74 68 65 20 6f 75   and (2b) the ou
1d280 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1d290 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1d2a0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
1d2b0 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 46   one.**        F
1d2c0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1d2d0 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63 61  ery that is a ca
1d2e0 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c 61 74  ndidate for flat
1d2f0 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69 73 0a  tening.  (2b is.
1d300 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20 74 6f  **        due to
1d310 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64   ticket [2f7170d
1d320 37 33 62 66 39 61 62 66 38 30 5d 20 66 72 6f 6d  73bf9abf80] from
1d330 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a   2015-02-09.).**
1d340 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
1d350 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
1d360 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1d370 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a   of a LEFT JOIN.
1d380 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 28 61 29  **        or (a)
1d390 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1d3a0 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
1d3b0 69 6e 20 61 6e 64 20 28 62 29 20 74 68 65 20 46  in and (b) the F
1d3c0 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ROM clause.**   
1d3d0 20 20 20 20 20 6f 66 20 74 68 65 20 73 75 62 71       of the subq
1d3e0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 63 6f  uery does not co
1d3f0 6e 74 61 69 6e 20 61 20 76 69 72 74 75 61 6c 20  ntain a virtual 
1d400 74 61 62 6c 65 20 61 6e 64 20 28 63 29 20 74 68  table and (c) th
1d410 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 75 74  e .**        out
1d420 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1d430 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a  an aggregate..**
1d440 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
1d450 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
1d460 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
1d470 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69  (**)  At one poi
1d480 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  nt restrictions 
1d490 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69  (4) and (5) defi
1d4a0 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20  ned a subset of 
1d4b0 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20  DISTINCT.**     
1d4c0 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74     sub-queries t
1d4d0 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65  hat were exclude
1d4e0 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69  d from this opti
1d4f0 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69  mization. Restri
1d500 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20  ction .**       
1d510 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62   (4) has since b
1d520 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20  een expanded to 
1d530 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54  exclude all DIST
1d540 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e  INCT subqueries.
1d550 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
1d560 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1d570 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
1d580 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
1d590 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
1d5a0 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
1d5b0 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
1d5c0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
1d5d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1d5e0 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
1d5f0 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
1d600 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
1d610 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
1d620 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61  dding a FROM cla
1d630 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  use with the spe
1d640 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1d650 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1d660 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1d670 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1d680 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1d690 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1d6a0 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1d6b0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1d6c0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1d6d0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1d6e0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1d6f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
1d700 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1d710 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1d720 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1d730 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
1d740 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
1d750 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  tes..**.**  (**)
1d760 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31    Restriction (1
1d770 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66  0) was removed f
1d780 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20  rom the code on 
1d790 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77  2005-02-05 but w
1d7a0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69  e.**        acci
1d7b0 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74  dently carried t
1d7c0 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61  he comment forwa
1d7d0 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39  rd until 2014-09
1d7e0 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a  -15.  Original.*
1d7f0 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a 20 22  *        text: "
1d800 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1d810 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
1d820 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
1d830 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20  r query .**     
1d840 20 20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20     does not use 
1d850 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28  LIMIT.".**.**  (
1d860 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
1d870 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1d880 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1d890 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
1d8a0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
1d8b0 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
1d8c0 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
1d8d0 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
1d8e0 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
1d8f0 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
1d900 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
1d910 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
1d920 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
1d930 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
1d940 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1d950 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
1d960 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
1d970 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  IT..**.**  (14) 
1d980 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1d990 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
1d9a0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
1d9b0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1d9c0 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
1d9d0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1d9e0 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
1d9f0 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
1da00 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
1da10 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
1da20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
1da30 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20  2339 and ticket 
1da40 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a  [02a8e81d44])..*
1da50 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
1da60 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1da70 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1da80 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
1da90 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
1daa0 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
1dab0 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
1dac0 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
1dad0 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
1dae0 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
1daf0 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
1db00 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
1db10 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
1db20 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
1db30 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
1db40 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1db50 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
1db60 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
1db70 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
1db80 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
1db90 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
1dba0 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
1dbb0 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
1dbc0 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
1dbd0 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1dbe0 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
1dbf0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
1dc00 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
1dc10 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
1dc20 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
1dc30 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
1dc40 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1dc50 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a  not a join.**.**
1dc60 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
1dc70 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
1dc80 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
1dc90 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
1dca0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
1dcb0 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
1dcc0 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
1dcd0 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
1dce0 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
1dcf0 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
1dd00 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1dd10 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1dd20 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
1dd30 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1dd40 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
1dd50 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
1dd60 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
1dd70 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
1dd80 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
1dd90 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
1dda0 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
1ddb0 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
1ddc0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
1ddd0 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
1dde0 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
1ddf0 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
1de00 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
1de10 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
1de20 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
1de30 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
1de40 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
1de50 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
1de60 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
1de70 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1de80 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
1de90 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
1dea0 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
1deb0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
1dec0 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
1ded0 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
1dee0 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
1def0 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
1df00 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
1df10 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
1df20 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
1df30 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
1df40 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
1df50 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1df60 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1df70 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
1df80 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
1df90 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
1dfa0 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  by clause of the
1dfb0 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
1dfc0 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
1dfd0 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
1dfe0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
1dff0 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
1e000 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75   (19)  The subqu
1e010 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1e020 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1e030 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1e040 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
1e050 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
1e060 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
1e070 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1e080 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1e090 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
1e0a0 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
1e0b0 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
1e0c0 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
1e0d0 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
1e0e0 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
1e0f0 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
1e100 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
1e110 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
1e120 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1e130 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
1e140 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
1e150 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
1e160 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
1e170 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e180 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20  .  But we.**    
1e190 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
1e1a0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
1e1b0 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
1e1c0 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
1e1d0 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75  **  (21)  The su
1e1e0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1e1f0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1e200 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1e210 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1e220 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69  STINCT.  (See ti
1e230 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63  cket [752e1646fc
1e240 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20  ])..**.**  (22) 
1e250 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1e260 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1e270 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33   CTE..**.**  (23
1e280 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73  )  The parent is
1e290 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1e2a0 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62   CTE, or the sub
1e2b0 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a  -query is not a.
1e2c0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1e2d0 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72  nd query. This r
1e2e0 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65  estriction is be
1e2f0 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69  cause transformi
1e300 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
1e310 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d   parent to a com
1e320 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66  pound query conf
1e330 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68  uses the code th
1e340 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20  at handles.**   
1e350 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71       recursive q
1e360 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53  ueries in multiS
1e370 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elect()..**.**  
1e380 28 32 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (24)  The subque
1e390 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
1e3a0 72 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73  regate that uses
1e3b0 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69   the built-in mi
1e3c0 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20  n() or .**      
1e3d0 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74    or max() funct
1e3e0 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20  ions.  (Without 
1e3f0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
1e400 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a  , a query like:.
1e410 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  **        "SELEC
1e420 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
1e430 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20   max(y), x FROM 
1e440 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e  t1)" would not n
1e450 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20  ecessarily.**   
1e460 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20       return the 
1e470 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63  value X for whic
1e480 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e  h Y was maximal.
1e490 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ).**.**.** In th
1e4a0 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
1e4b0 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
1e4c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1e4d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
1e4e0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
1e4f0 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
1e500 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
1e510 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
1e520 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
1e530 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
1e540 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
1e550 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
1e560 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
1e570 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
1e580 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
1e590 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
1e5a0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1e5b0 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
1e5c0 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
1e5d0 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
1e5e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1e5f0 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
1e600 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
1e610 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
1e620 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
1e630 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1e640 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
1e650 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
1e660 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
1e670 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
1e680 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
1e690 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1e6a0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1e6b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1e6c0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1e6d0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
1e6e0 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
1e6f0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
1e700 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
1e710 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1e720 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
1e730 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
1e740 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
1e750 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1e760 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
1e770 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
1e780 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
1e790 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
1e7a0 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
1e7b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1e7c0 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1e7d0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
1e7e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
1e7f0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
1e800 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1e810 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  text;.  Select *
1e820 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43  pParent;    /* C
1e830 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c  urrent UNION ALL
1e840 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74 68   term of the oth
1e850 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 65  er query */.  Se
1e860 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
1e870 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
1e880 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
1e890 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  y" */.  Select *
1e8a0 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50  pSub1;      /* P
1e8b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69  ointer to the ri
1e8c0 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69  ghtmost select i
1e8d0 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  n sub-query */. 
1e8e0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
1e8f0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
1e900 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1e910 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1e920 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
1e930 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
1e940 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1e950 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
1e960 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
1e970 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
1e980 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
1e990 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
1e9a0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
1e9b0 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 2d 31   iNewParent = -1
1e9c0 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20  ;/* Replacement 
1e9d0 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72 65 6e  table for iParen
1e9e0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66  t */.  int isLef
1e9f0 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20 54 72  tJoin = 0; /* Tr
1ea00 75 65 20 69 66 20 70 53 75 62 20 69 73 20 74 68  ue if pSub is th
1ea10 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
1ea20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 20 20  a LEFT JOIN */  
1ea30 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20    .  int i;     
1ea40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1ea50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
1ea60 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ea80 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1ea90 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
1eaa0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
1eab0 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
1eac0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  subquery */.  sq
1ead0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1eae0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68  se->db;..  /* Ch
1eaf0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
1eb00 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
1eb10 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
1eb20 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
1eb30 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
1eb40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
1eb50 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e  ior==0 );  /* Un
1eb60 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20  able to flatten 
1eb70 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73  compound queries
1eb80 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
1eb90 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
1eba0 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46  b, SQLITE_QueryF
1ebb0 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75  lattener) ) retu
1ebc0 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
1ebd0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1ebe0 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
1ebf0 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
1ec00 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
1ec10 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
1ec20 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e  iFrom];.  iParen
1ec30 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43  t = pSubitem->iC
1ec40 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20  ursor;.  pSub = 
1ec50 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1ec60 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
1ec70 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75  b!=0 );.  if( su
1ec80 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1ec90 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20 72     if( isAgg ) r
1eca0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1ecd0 69 63 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a  iction (1)   */.
1ece0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53      if( pSrc->nS
1ecf0 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1ed20 72 69 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f  riction (2a)  */
1ed30 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68  .    if( (p->pWh
1ed40 65 72 65 20 26 26 20 45 78 70 72 48 61 73 50 72  ere && ExprHasPr
1ed50 6f 70 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65  operty(p->pWhere
1ed60 2c 45 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20  ,EP_Subquery)). 
1ed70 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45      || (sqlite3E
1ed80 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
1ed90 70 45 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62  pEList) & EP_Sub
1eda0 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c  query)!=0.     |
1edb0 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69  | (sqlite3ExprLi
1edc0 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65  stFlags(p->pOrde
1edd0 72 42 79 29 20 26 20 45 50 5f 53 75 62 71 75 65  rBy) & EP_Subque
1ede0 72 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  ry)!=0.    ){.  
1edf0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1ee30 63 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20  ction (2b)  */. 
1ee40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 53 75 62     }.  }..  pSub
1ee50 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1ee60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1ee70 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
1ee80 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
1ee90 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
1eea0 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
1eeb0 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
1eec0 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
1eed0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1eee0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
1eef0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
1ef00 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
1ef10 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
1ef20 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
1ef30 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
1ef40 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
1ef50 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1ef60 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
1ef70 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1ef80 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
1ef90 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
1efa0 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
1efb0 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
1efc0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1efd0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
1efe0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1eff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1f000 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
1f010 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
1f020 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1f050 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
1f060 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1f070 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
1f080 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
1f090 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
1f0a0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0d0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f0e0 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
1f0f0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1f100 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f130 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
1f140 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1f150 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
1f160 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1f170 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f180 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69  tion (5)  */.  i
1f190 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f1a0 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
1f1b0 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
1f1c0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1f1d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1f1e0 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
1f1f0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1f200 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1f210 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
1f220 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1f230 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1f240 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f250 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
1f260 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1f270 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1f280 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
1f290 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f2c0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
1f2d0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
1f2e0 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
1f2f0 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
1f300 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f310 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f320 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
1f330 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1f340 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
1f350 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1f360 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f370 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
1f380 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1f390 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1f3a0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
1f3b0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1f3c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1f3d0 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
1f3e0 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
1f3f0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1f400 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a  SF_Recursive );.
1f410 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1f420 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f430 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69  MinMaxAgg );.  i
1f440 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1f450 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
1f460 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20  e|SF_MinMaxAgg) 
1f470 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1f480 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1f490 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a   (22) and (24) *
1f4a0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1f4b0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1f4c0 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62  cursive) && pSub
1f4d0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1f4e0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1f4f0 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f  triction (23) */
1f500 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
1f510 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1f520 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1f530 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
1f540 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  OIN, then the.  
1f550 2a 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  ** subquery may 
1f560 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74  not be a join it
1f570 73 65 6c 66 2e 20 20 45 78 61 6d 70 6c 65 20 6f  self.  Example o
1f580 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
1f590 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1f5a0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1f5b0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1f5c0 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
1f5d0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
1f5e0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
1f5f0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
1f600 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
1f610 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1f620 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
1f630 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
1f640 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
1f650 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
1f660 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75  *.  ** If the su
1f670 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
1f680 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1f690 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
1f6a0 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20   the outer.  ** 
1f6b0 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 20  query cannot be 
1f6c0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
1f6d0 68 69 73 20 69 73 20 61 6e 20 61 72 74 69 66 61  his is an artifa
1f6e0 63 74 20 6f 66 20 74 68 65 20 77 61 79 20 61 67  ct of the way ag
1f6f0 67 72 65 67 61 74 65 73 0a 20 20 2a 2a 20 61 72  gregates.  ** ar
1f700 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20 74 68  e processed - th
1f710 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e  ere is no mechan
1f720 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ism to determine
1f730 20 69 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   if the LEFT JOI
1f740 4e 0a 20 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f  N.  ** table sho
1f750 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e  uld be all-NULL.
1f760 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
1f770 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30 36  lso tickets #306
1f780 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33 30  , #350, and #330
1f790 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  0..  */.  if( (p
1f7a0 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
1f7b0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
1f7c0 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65 66  !=0 ){.    isLef
1f7d0 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69  tJoin = 1;.    i
1f7e0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1f7f0 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49  >1 || isAgg || I
1f800 73 56 69 72 74 75 61 6c 28 70 53 75 62 53 72 63  sVirtual(pSubSrc
1f810 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a  ->a[0].pTab) ){.
1f820 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1f830 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f840 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  3) */.    }.  }.
1f850 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
1f860 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20  TRA_IFNULLROW.  
1f870 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e 30  else if( iFrom>0
1f880 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20   && !isAgg ){.  
1f890 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73 4c    /* Setting isL
1f8a0 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61  eftJoin to -1 ca
1f8b0 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f  uses OP_IfNullRo
1f8c0 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20  w opcodes to be 
1f8d0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20 20  generated for.  
1f8e0 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65 72    ** every refer
1f8f0 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73 75  ence to any resu
1f900 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73  lt column from s
1f910 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f 69  ubquery in a joi
1f920 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20 74  n, even.    ** t
1f930 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20 6e  hough they are n
1f940 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  ot necessary.  T
1f950 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73 2d  his will stress-
1f960 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e 75  test the OP_IfNu
1f970 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f 70  llRow .    ** op
1f980 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73 4c  code. */.    isL
1f990 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20  eftJoin = -1;.  
1f9a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
1f9b0 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49  estriction 17: I
1f9c0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1f9d0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
1f9e0 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
1f9f0 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
1fa00 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
1fa10 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
1fa20 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
1fa30 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
1fa40 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
1fa50 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
1fa60 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
1fa70 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
1fa80 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
1fa90 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
1faa0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
1fab0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  or ){.    if( pS
1fac0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1fad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1fae0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1faf0 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  20 */.    }.    
1fb00 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d  if( isAgg || (p-
1fb10 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1fb20 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70  istinct)!=0 || p
1fb30 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a  Src->nSrc!=1 ){.
1fb40 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1fb50 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53      }.    for(pS
1fb60 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b  ub1=pSub; pSub1;
1fb70 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50   pSub1=pSub1->pP
1fb80 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73  rior){.      tes
1fb90 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
1fba0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1fbb0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1fbc0 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
1fbd0 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ct );.      test
1fbe0 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
1fbf0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1fc00 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1fc10 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
1fc20 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  te );.      asse
1fc30 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d  rt( pSub->pSrc!=
1fc40 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1fc50 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  t( pSub->pEList-
1fc60 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70  >nExpr==pSub1->p
1fc70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1fc80 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31        if( (pSub1
1fc90 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1fca0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1fcb0 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20  regate))!=0.    
1fcc0 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50     || (pSub1->pP
1fcd0 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f  rior && pSub1->o
1fce0 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20  p!=TK_ALL) .    
1fcf0 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72     || pSub1->pSr
1fd00 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20  c->nSrc<1.      
1fd10 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1fd20 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
1fd30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75     testcase( pSu
1fd40 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31  b1->pSrc->nSrc>1
1fd50 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
1fd60 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38  * Restriction 18
1fd70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1fd80 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1fd90 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
1fda0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
1fdb0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1fdc0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
1fdd0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
1fde0 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  >a[ii].u.x.iOrde
1fdf0 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
1fe00 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1fe10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a    }.  }..  /****
1fe20 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
1fe30 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65  is point, flatte
1fe40 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1fe50 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45  d. *****/.  SELE
1fe60 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
1fe70 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e  ,p,("flatten %s.
1fe80 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c  %p from term %d\
1fe90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1fea0 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65         pSub->zSe
1feb0 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72  lName, pSub, iFr
1fec0 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68  om));..  /* Auth
1fed0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
1fee0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
1fef0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1ff00 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
1ff10 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
1ff20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1ff30 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1ff40 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1ff50 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
1ff60 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
1ff70 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1ff80 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
1ff90 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
1ffa0 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
1ffb0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1ffc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ffd0 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
1ffe0 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
1fff0 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
20000 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
20010 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
20020 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
20030 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
20040 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
20050 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
20060 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
20070 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
20080 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
20090 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
200a0 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
200b0 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
200c0 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
200d0 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
200e0 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
200f0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
20100 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
20110 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
20120 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
20130 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
20140 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
20150 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
20160 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
20170 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
20180 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
20190 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
201a0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
201b0 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
201c0 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
201d0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
201e0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
201f0 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
20200 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
20210 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
20220 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
20230 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
20240 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
20250 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
20260 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
20270 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
20280 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
20290 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
202a0 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
202b0 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
202c0 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
202d0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
202e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
202f0 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
20300 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
20310 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
20320 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
20330 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
20340 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
20350 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
20360 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
20370 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
20380 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
20390 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
203a0 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
203b0 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
203c0 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
203d0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
203e0 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
203f0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
20400 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
20410 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
20420 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
20430 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
20440 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
20450 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
20460 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
20470 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20  Limit;.    Expr 
20480 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  *pOffset = p->pO
20490 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63  ffset;.    Selec
204a0 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
204b0 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
204c0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
204d0 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
204e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
204f0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
20500 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  0;.    p->pOffse
20510 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
20520 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
20530 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20  up(db, p, 0);.  
20540 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
20550 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75  etName(pNew, pSu
20560 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  b->zSelName);.  
20570 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
20580 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70  Offset;.    p->p
20590 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
205a0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
205b0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
205c0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
205d0 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
205e0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
205f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
20600 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
20610 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20620 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
20630 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
20640 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
20650 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
20660 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
20670 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
20680 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
20690 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
206a0 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20  CE(2,pParse,p,. 
206b0 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75          ("compou
206c0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
206d0 74 65 6e 65 72 20 63 72 65 61 74 65 73 20 25 73  tener creates %s
206e0 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a  .%p as peer\n",.
206f0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a           pNew->z
20700 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b  SelName, pNew));
20710 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
20720 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
20730 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
20740 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74  .  /* Begin flat
20750 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d  tening the iFrom
20760 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
20770 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20   FROM clause .  
20780 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ** in the outer 
20790 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53  query..  */.  pS
207a0 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75  ub = pSub1 = pSu
207b0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
207c0 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
207d0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
207e0 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
207f0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
20800 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a   ** subquery.  *
20810 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
20820 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
20830 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71  zDatabase);.  sq
20840 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
20850 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
20860 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
20870 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
20880 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69  zAlias);.  pSubi
20890 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
208a0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
208b0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75  zName = 0;.  pSu
208c0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
208d0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  0;.  pSubitem->p
208e0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  Select = 0;..  /
208f0 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67  * Defer deleting
20900 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
20910 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
20920 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
20930 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  ery until code g
20940 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a  eneration is.  *
20950 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63  * complete, sinc
20960 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c  e there may stil
20970 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61  l exist Expr.pTa
20980 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20  b entries that. 
20990 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
209a0 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
209b0 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
209c0 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
209d0 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74    **.  ** pSubit
209e0 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61  em->pTab is alwa
209f0 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74  ys non-NULL by t
20a00 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  est restrictions
20a10 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65   and tests above
20a20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ..  */.  if( ALW
20a30 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54  AYS(pSubitem->pT
20a40 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61  ab!=0) ){.    Ta
20a50 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d  ble *pTabToDel =
20a60 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
20a70 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44  .    if( pTabToD
20a80 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29  el->nTabRef==1 )
20a90 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70  {.      Parse *p
20aa0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
20ab0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
20ac0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
20ad0 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
20ae0 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65  ombie = pTopleve
20af0 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  l->pZombieTab;. 
20b00 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
20b10 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
20b20 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
20b30 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
20b40 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20  el->nTabRef--;. 
20b50 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65     }.    pSubite
20b60 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d  m->pTab = 0;.  }
20b70 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
20b80 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  wing loop runs o
20b90 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72  nce for each ter
20ba0 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  m in a compound-
20bb0 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c  subquery.  ** fl
20bc0 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73  attening (as des
20bd0 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20  cribed above).  
20be0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
20bf0 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64  a different kind
20c00 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e  .  ** of flatten
20c10 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69  ing - a flatteni
20c20 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
20c30 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
20c40 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20  y flattening -. 
20c50 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f   ** then this lo
20c60 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63  op only runs onc
20c70 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
20c80 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c  s loop moves all
20c90 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
20ca0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
20cb0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
20cc0 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
20cd0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
20ce0 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
20cf0 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
20d00 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
20d10 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
20d20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
20d30 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
20d40 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
20d50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
20d60 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
20d70 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
20d80 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
20d90 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
20da0 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
20db0 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
20dc0 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
20dd0 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
20de0 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
20df0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
20e00 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
20e10 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
20e20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
20e30 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
20e40 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  in..  */.  for(p
20e50 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e  Parent=p; pParen
20e60 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65  t; pParent=pPare
20e70 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62  nt->pPrior, pSub
20e80 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
20e90 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b      int nSubSrc;
20ea0 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65  .    u8 jointype
20eb0 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
20ec0 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20  c = pSub->pSrc; 
20ed0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
20ee0 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  se of subquery *
20ef0 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20  /.    nSubSrc = 
20f00 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20  pSubSrc->nSrc;  
20f10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
20f20 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46  ms in subquery F
20f30 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
20f40 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
20f50 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
20f60 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
20f70 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
20f80 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  ..    if( pSrc )
20f90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20fa0 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f  pParent==p );  /
20fb0 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72  * First time thr
20fc0 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
20fd0 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
20fe0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a  = pSubitem->fg.j
20ff0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
21000 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
21010 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
21020 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
21030 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
21040 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
21050 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
21060 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
21070 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
21080 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
21090 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
210a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
210b0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
210c0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
210d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
210e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
210f0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
21100 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
21110 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
21120 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
21130 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
21140 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
21150 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
21160 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
21170 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
21180 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
21190 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
211a0 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
211b0 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
211c0 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
211d0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
211e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
211f0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
21200 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
21210 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
21220 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
21230 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
21240 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
21250 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
21260 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
21270 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
21280 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
21290 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
212a0 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
212b0 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
212c0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
212d0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
212e0 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
212f0 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
21300 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75   query FROM clau
21310 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20  se to 4 slots.. 
21320 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65     ** The middle
21330 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
21340 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
21350 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
21360 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72  space.    ** for
21370 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74   the two element
21380 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
21390 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
213a0 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
213b0 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
213c0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
213d0 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73  >pSrc = pSrc = s
213e0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
213f0 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e  arge(db, pSrc, n
21400 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
21410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
21420 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
21430 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
21440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21450 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
21460 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
21470 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
21480 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
21490 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
214a0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
214b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
214c0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
214d0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
214e0 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69  te(db, pSrc->a[i
214f0 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b  +iFrom].pUsing);
21500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21510 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
21520 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
21530 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
21540 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
21550 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
21560 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 70 53   iNewParent = pS
21570 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  ubSrc->a[i].iCur
21580 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  sor;.      memse
21590 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
215a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
215b0 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
215c0 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
215d0 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  From].fg.jointyp
215e0 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
215f0 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  .    /* Now begi
21600 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
21610 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
21620 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
21630 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  or .    ** refer
21640 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
21650 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
21660 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20  r query..    ** 
21670 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
21680 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
21690 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
216a0 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
216b0 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
216c0 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
216d0 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20  E a>b;.    **   
216e0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
216f0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
21700 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
21710 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
21720 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c     /.    **    \
21730 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21740 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
21750 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
21760 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21770 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  /.    **.    ** 
21780 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
21790 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
217a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
217b0 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
217c0 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22  e see.    ** "a"
217d0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
217e0 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
217f0 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
21800 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
21810 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  +10"..    */.   
21820 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
21830 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
21840 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
21850 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
21860 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
21870 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
21880 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
21890 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
218a0 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
218b0 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
218c0 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
218d0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
218e0 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
218f0 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
21900 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
21910 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
21920 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
21930 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
21940 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
21950 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
21960 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
21970 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
21980 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
21990 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
219a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
219b0 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
219c0 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
219d0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
219e0 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
219f0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
21a00 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
21a10 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
21a20 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
21a30 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
21a40 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
21a50 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
21a60 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
21a70 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
21a80 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
21a90 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
21aa0 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
21ab0 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
21ac0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
21ad0 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
21ae0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
21af0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
21b00 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
21b10 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
21b20 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
21b30 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
21b40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
21b50 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
21b60 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
21b70 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
21b80 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
21b90 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
21ba0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
21bb0 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
21bc0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
21bd0 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20   }.    pWhere = 
21be0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
21bf0 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
21c00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4c   0);.    if( isL
21c10 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20  eftJoin>0 ){.   
21c20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
21c30 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e  Where, iNewParen
21c40 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
21c50 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
21c60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21c70 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
21c80 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  g==0 );.      pP
21c90 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
21ca0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
21cb0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
21cc0 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
21cd0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
21ce0 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
21cf0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 0a 20  e3ExprAnd(db, . 
21d00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21d10 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
21d20 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 2c 20 70  ->pHaving, 0), p
21d30 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 0a  Parent->pHaving.
21d40 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
21d50 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
21d60 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
21d70 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
21d80 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
21d90 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
21da0 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
21db0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
21dc0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
21dd0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
21de0 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65  prAnd(db, pWhere
21df0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
21e00 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
21e10 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
21e20 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ed==0 ){.      S
21e30 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20  ubstContext x;. 
21e40 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20       x.pParse = 
21e50 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e  pParse;.      x.
21e60 69 54 61 62 6c 65 20 3d 20 69 50 61 72 65 6e 74  iTable = iParent
21e70 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61  ;.      x.iNewTa
21e80 62 6c 65 20 3d 20 69 4e 65 77 50 61 72 65 6e 74  ble = iNewParent
21e90 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74  ;.      x.isLeft
21ea0 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a 6f 69  Join = isLeftJoi
21eb0 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73  n;.      x.pELis
21ec0 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  t = pSub->pEList
21ed0 3b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  ;.      substSel
21ee0 65 63 74 28 26 78 2c 20 70 50 61 72 65 6e 74 2c  ect(&x, pParent,
21ef0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   0);.    }.  .  
21f00 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
21f10 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
21f20 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
21f30 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
21f40 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
21f50 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
21f60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
21f70 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ent->selFlags |=
21f80 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
21f90 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20  & SF_Distinct;. 
21fa0 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20   .    /*.    ** 
21fb0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
21fc0 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
21fd0 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
21fe0 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
21ff0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
22000 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
22010 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
22020 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
22030 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
22040 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20  his.    ** does 
22050 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68  not work if eith
22060 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  er limit is nega
22070 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
22080 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
22090 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  t ){.      pPare
220a0 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75  nt->pLimit = pSu
220b0 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  b->pLimit;.     
220c0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
220d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
220e0 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c  /* Finially, del
220f0 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74  ete what is left
22100 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
22110 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
22120 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   success..  */. 
22130 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
22140 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b  lete(db, pSub1);
22150 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
22160 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
22170 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
22180 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
22190 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
221a0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  100,pParse,p,("A
221b0 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a  fter flattening:
221c0 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
221d0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
221e0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
221f0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
22200 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  1;.}.#endif /* !
22210 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
22220 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
22230 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22240 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
22250 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
22260 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
22270 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
22280 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
22290 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f  W)./*.** Make co
222a0 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74  pies of relevant
222b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
222c0 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72  rms of the outer
222d0 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74   query into.** t
222e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
222f0 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45 78  of subquery.  Ex
22300 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
22310 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
22320 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d  ELECT a AS x, c-
22330 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20  d AS y FROM t1) 
22340 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d  WHERE x=5 AND y=
22350 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66  10;.**.** Transf
22360 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a  ormed into:.**.*
22370 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
22380 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20  OM (SELECT a AS 
22390 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d  x, c-d AS y FROM
223a0 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41 4e   t1 WHERE a=5 AN
223b0 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20  D c-d=10).**    
223c0 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
223d0 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68  =10;.**.** The h
223e0 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65 20  ope is that the 
223f0 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74  terms added to t
22400 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77  he inner query w
22410 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65  ill make it more
22420 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  .** efficient..*
22430 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65  *.** Do not atte
22440 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  mpt this optimiz
22450 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  ation if:.**.** 
22460 20 20 28 31 29 20 54 68 65 20 69 6e 6e 65 72 20    (1) The inner 
22470 71 75 65 72 79 20 69 73 20 61 6e 20 61 67 67 72  query is an aggr
22480 65 67 61 74 65 2e 20 20 28 49 6e 20 74 68 61 74  egate.  (In that
22490 20 63 61 73 65 2c 20 77 65 27 64 20 72 65 61 6c   case, we'd real
224a0 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20 20  ly want.**      
224b0 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 75 74   to copy the out
224c0 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  er WHERE-clause 
224d0 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 48  terms onto the H
224e0 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  AVING clause of 
224f0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 6e  the.**       inn
22500 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 74  er query.  But t
22510 68 65 79 20 70 72 6f 62 61 62 6c 79 20 77 6f 6e  hey probably won
22520 27 74 20 68 65 6c 70 20 74 68 65 72 65 20 73 6f  't help there so
22530 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e 29   do not bother.)
22540 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65  .**.**   (2) The
22550 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
22560 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61  the recursive pa
22570 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74  rt of a common t
22580 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e  able expression.
22590 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  .**.**   (3) The
225a0 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73   inner query has
225b0 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
225c0 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67  (since the chang
225d0 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a  es to the WHERE.
225e0 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20 77  **       close w
225f0 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20  ould change the 
22600 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c  meaning of the L
22610 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  IMIT)..**.**   (
22620 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  4) The inner que
22630 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
22640 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
22650 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63 61  T JOIN.  (The ca
22660 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e  ller.**       en
22670 66 6f 72 63 65 73 20 74 68 69 73 20 72 65 73 74  forces this rest
22680 72 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74 68  riction since th
22690 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
226a0 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68 0a  not have enough.
226b0 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61  **       informa
226c0 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a  tion to know.).*
226d0 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57  *.**   (5) The W
226e0 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
226f0 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
22700 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  s in the ON or U
22710 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20  SING clause.**  
22720 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a       of a LEFT J
22730 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  OIN..**.** Retur
22740 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65  n 0 if no change
22750 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e  s are made and n
22760 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f  on-zero if one o
22770 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61  r more WHERE cla
22780 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65  use.** terms are
22790 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f   duplicated into
227a0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
227b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75 73  /.static int pus
227c0 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
227d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
227e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
227f0 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d  e context (for m
22800 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72 6f  alloc() and erro
22810 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a  r reporting) */.
22820 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c    Select *pSubq,
22830 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
22840 75 62 71 75 65 72 79 20 77 68 6f 73 65 20 57 48  ubquery whose WH
22850 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f  ERE clause is to
22860 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f   be augmented */
22870 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
22880 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22890 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
228a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
228b0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  */.  int iCursor
228c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
228d0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
228e0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29  he subquery */.)
228f0 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
22900 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b    int nChng = 0;
22910 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20  .  Select *pX;  
22920 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
22930 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 63 6f 6d  looping over com
22940 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 69 6e  pound SELECTs in
22950 20 70 53 75 62 71 20 2a 2f 0a 20 20 69 66 28 20   pSubq */.  if( 
22960 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75  pWhere==0 ) retu
22970 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70  rn 0;.  for(pX=p
22980 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d  Subq; pX; pX=pX-
22990 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 66  >pPrior){.    if
229a0 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20  ( (pX->selFlags 
229b0 26 20 28 53 46 5f 41 67 67 72 65 67 61 74 65 7c  & (SF_Aggregate|
229c0 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 21 3d  SF_Recursive))!=
229d0 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
229e0 61 73 65 28 20 70 58 2d 3e 73 65 6c 46 6c 61 67  ase( pX->selFlag
229f0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
22a00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
22a10 73 65 28 20 70 58 2d 3e 73 65 6c 46 6c 61 67 73  se( pX->selFlags
22a20 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
22a30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22a40 65 28 20 70 58 21 3d 70 53 75 62 71 20 29 3b 0a  e( pX!=pSubq );.
22a50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
22a60 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  /* restrictions 
22a70 28 31 29 20 61 6e 64 20 28 32 29 20 2a 2f 0a 20  (1) and (2) */. 
22a80 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
22a90 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20  Subq->pLimit!=0 
22aa0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
22ab0 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
22ac0 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69  (3) */.  }.  whi
22ad0 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d  le( pWhere->op==
22ae0 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43  TK_AND ){.    nC
22af0 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57  hng += pushDownW
22b00 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65  hereTerms(pParse
22b10 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d  , pSubq, pWhere-
22b20 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73 6f 72  >pRight, iCursor
22b30 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
22b40 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20  pWhere->pLeft;. 
22b50 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
22b60 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
22b70 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72  EP_FromJoin) ) r
22b80 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
22b90 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a 20 20 69  riction 5 */.  i
22ba0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
22bb0 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57  TableConstant(pW
22bc0 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29  here, iCursor) )
22bd0 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20  {.    nChng++;. 
22be0 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20     while( pSubq 
22bf0 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f  ){.      SubstCo
22c00 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70  ntext x;.      p
22c10 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
22c20 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
22c30 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20   pWhere, 0);.   
22c40 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50     x.pParse = pP
22c50 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54  arse;.      x.iT
22c60 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
22c70 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c        x.iNewTabl
22c80 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  e = iCursor;.   
22c90 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
22ca0 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c  = 0;.      x.pEL
22cb0 69 73 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c  ist = pSubq->pEL
22cc0 69 73 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ist;.      pNew 
22cd0 3d 20 73 75 62 73 74 45 78 70 72 28 26 78 2c 20  = substExpr(&x, 
22ce0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 53 75  pNew);.      pSu
22cf0 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  bq->pWhere = sql
22d00 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
22d10 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70  se->db, pSubq->p
22d20 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
22d30 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75 62      pSubq = pSub
22d40 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d  q->pPrior;.    }
22d50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
22d60 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  hng;.}.#endif /*
22d70 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22d80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
22d90 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
22da0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
22db0 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e  ../*.** Based on
22dc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22dd0 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
22de0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
22df0 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   by the first.**
22e00 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20   argument, this 
22e10 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
22e20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
22e30 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
22e40 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20      * the query 
22e50 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20  contains just a 
22e60 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65  single aggregate
22e70 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20   function,.**   
22e80 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65   * the aggregate
22e90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74   function is eit
22ea0 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  her min() or max
22eb0 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20  (), and.**    * 
22ec0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
22ed0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
22ee0 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  nction is a colu
22ef0 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  mn value..**.** 
22f00 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
22f10 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68  ove are true, th
22f20 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  en WHERE_ORDERBY
22f30 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
22f40 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20  DERBY_MAX.** is 
22f50 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72  returned as appr
22f60 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a  opriate. Also, *
22f70 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
22f80 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
22f90 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75  .** list of argu
22fa0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
22fb0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65  the aggregate be
22fc0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
22fd0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
22fe0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
22ff0 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a  e are not met, *
23000 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
23010 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52  to 0 and.** WHER
23020 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
23030 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
23040 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
23050 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a  xQuery(AggInfo *
23060 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69  pAggInfo, ExprLi
23070 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
23080 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
23090 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
230a0 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  L;          /* R
230b0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
230c0 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b    *ppMinMax = 0;
230d0 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
230e0 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  >nFunc==1 ){.   
230f0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
23100 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
23110 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72  ].pExpr; /* Aggr
23120 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
23130 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
23140 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
23150 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  x.pList;      /*
23160 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
23170 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
23180 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
23190 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
231a0 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  CTION );.    if(
231b0 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
231c0 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
231d0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
231e0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
231f0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f  LUMN ){.      co
23200 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20  nst char *zFunc 
23210 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
23220 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
23230 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
23240 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
23250 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
23260 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
23270 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
23280 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
23290 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
232a0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
232b0 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
232c0 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
232d0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
232e0 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  X;.        *ppMi
232f0 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
23300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23310 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
23320 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70  inMax==0 || (*pp
23330 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d  MinMax)->nExpr==
23340 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  1 );.  return eR
23350 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
23360 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
23370 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
23380 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
23390 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
233a0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
233b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
233c0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
233d0 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
233e0 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
233f0 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
23400 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
23410 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
23420 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
23430 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
23440 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
23450 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
23460 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
23470 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
23480 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
23490 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
234a0 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
234b0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
234c0 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
234d0 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
234e0 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
234f0 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
23500 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
23510 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
23520 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
23530 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
23540 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
23550 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
23560 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
23570 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
23580 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
23590 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
235a0 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
235b0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
235c0 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
235d0 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
235e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
235f0 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
23600 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
23610 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
23620 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
23630 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
23640 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
23650 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
23660 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
23670 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
23680 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
23690 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
236a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
236b0 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
236c0 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
236d0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
236e0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
236f0 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  .pFunc->funcFlag
23700 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  s&SQLITE_FUNC_CO
23710 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  UNT)==0 ) return
23720 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
23730 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e  >flags&EP_Distin
23740 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ct ) return 0;..
23750 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
23760 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ../*.** If the s
23770 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20  ource-list item 
23780 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
23790 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e  ument was augmen
237a0 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49  ted with an.** I
237b0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
237c0 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f  , then try to lo
237d0 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69  cate the specifi
237e0 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  ed index. If the
237f0 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61  re.** was such a
23800 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
23810 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e  named index cann
23820 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  ot be found, ret
23830 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
23840 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61  RROR and leave a
23850 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
23860 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f  e. Otherwise, po
23870 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d  pulate .** pFrom
23880 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74  ->pIndex and ret
23890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
238a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
238b0 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72  exedByLookup(Par
238c0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
238d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
238e0 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
238f0 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46  From->pTab && pF
23900 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  rom->fg.isIndexe
23910 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  dBy ){.    Table
23920 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
23930 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a  pTab;.    char *
23940 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72  zIndexedBy = pFr
23950 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  om->u1.zIndexedB
23960 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  y;.    Index *pI
23970 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
23980 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a  =pTab->pIndex; .
23990 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20          pIdx && 
239a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
239b0 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64  Idx->zName, zInd
239c0 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20  exedBy); .      
239d0 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
239e0 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
239f0 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
23a00 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23a10 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
23a20 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
23a30 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20  ndexedBy, 0);.  
23a40 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
23a50 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
23a60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23a70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
23a80 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65    pFrom->pIBInde
23a90 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20  x = pIdx;.  }.  
23aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23ab0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74  ;.}./*.** Detect
23ac0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
23ad0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
23ae0 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59   use an ORDER BY
23af0 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a   clause with .**
23b00 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
23b10 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
23b20 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ce..**.**    SEL
23b30 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
23b40 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
23b50 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  . FROM t2 ORDER 
23b60 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  BY .. COLLATE ..
23b70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ..**.** These ar
23b80 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
23b90 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a   subquery:.**.**
23ba0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23bb0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  M (SELECT ... FR
23bc0 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
23bd0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29  ECT ... FROM t2)
23be0 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59  .**     ORDER BY
23bf0 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e   ... COLLATE ...
23c00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
23c10 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  sformation is ne
23c20 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
23c30 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  the multiSelectO
23c40 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65  rderBy() routine
23c50 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67  .** above that g
23c60 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
23c70 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  e for a compound
23c80 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20   SELECT with an 
23c90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
23ca0 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20  ** uses a merge 
23cb0 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72  algorithm that r
23cc0 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65  equires the same
23cd0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
23ce0 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65  nce on the.** re
23cf0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20  sult columns as 
23d00 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  on the ORDER BY 
23d10 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63  clause.  See tic
23d20 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77  ket.** http://ww
23d30 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
23d40 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61  /info/6709574d2a
23d50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
23d60 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e  sformation is on
23d70 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58  ly needed for EX
23d80 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c  CEPT, INTERSECT,
23d90 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54   and UNION..** T
23da0 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
23db0 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65  rator works fine
23dc0 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63   with multiSelec
23dd0 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20  tOrderBy() even 
23de0 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72  when.** there ar
23df0 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20  e COLLATE terms 
23e00 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  in the ORDER BY.
23e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
23e20 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
23e30 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57  lectToSubquery(W
23e40 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
23e50 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
23e60 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  t i;.  Select *p
23e70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  New;.  Select *p
23e80 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  X;.  sqlite3 *db
23e90 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
23ea0 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53  ist_item *a;.  S
23eb0 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b  rcList *pNewSrc;
23ec0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23ed0 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b  ;.  Token dummy;
23ee0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ..  if( p->pPrio
23ef0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  r==0 ) return WR
23f00 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66  C_Continue;.  if
23f10 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
23f20 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
23f30 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58  ntinue;.  for(pX
23f40 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f  =p; pX && (pX->o
23f50 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d  p==TK_ALL || pX-
23f60 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b  >op==TK_SELECT);
23f70 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b   pX=pX->pPrior){
23f80 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20  }.  if( pX==0 ) 
23f90 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23fa0 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f  nue;.  a = p->pO
23fb0 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72  rderBy->a;.  for
23fc0 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  (i=p->pOrderBy->
23fd0 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69  nExpr-1; i>=0; i
23fe0 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69  --){.    if( a[i
23ff0 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ].pExpr->flags &
24000 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72   EP_Collate ) br
24010 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eak;.  }.  if( i
24020 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  <0 ) return WRC_
24030 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20  Continue;..  /* 
24040 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
24050 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
24060 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  ns the transform
24070 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
24080 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  d. */..  pParse 
24090 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
240a0 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
240b0 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
240c0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
240d0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
240e0 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
240f0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ew==0 ) return W
24100 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73  RC_Abort;.  mems
24110 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69  et(&dummy, 0, si
24120 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20  zeof(dummy));.  
24130 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65  pNewSrc = sqlite
24140 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
24150 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c  omTerm(pParse,0,
24160 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c  0,0,&dummy,pNew,
24170 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  0,0);.  if( pNew
24180 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
24190 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e  WRC_Abort;.  *pN
241a0 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53  ew = *p;.  p->pS
241b0 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20  rc = pNewSrc;.  
241c0 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  p->pEList = sqli
241d0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
241e0 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c  d(pParse, 0, sql
241f0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
24200 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20  ASTERISK, 0));. 
24210 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45   p->op = TK_SELE
24220 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  CT;.  p->pWhere 
24230 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  = 0;.  pNew->pGr
24240 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65  oupBy = 0;.  pNe
24250 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  w->pHaving = 0;.
24260 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
24270 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f   = 0;.  p->pPrio
24280 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78  r = 0;.  p->pNex
24290 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74  t = 0;.  p->pWit
242a0 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46  h = 0;.  p->selF
242b0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
242c0 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20  ound;.  assert( 
242d0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
242e0 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20  F_Converted)==0 
242f0 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  );.  p->selFlags
24300 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64   |= SF_Converted
24310 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
24320 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20  ->pPrior!=0 );. 
24330 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70   pNew->pPrior->p
24340 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
24350 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  New->pLimit = 0;
24360 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
24370 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
24380 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
24390 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
243a0 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63  ee if the FROM c
243b0 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d  lause term pFrom
243c0 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65   has table-value
243d0 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  d function.** ar
243e0 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20  guments.  If it 
243f0 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  does, leave an e
24400 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
24410 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
24420 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73  n.** non-zero, s
24430 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f  ince pFrom is no
24440 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  t allowed to be 
24450 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  a table-valued f
24460 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
24470 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46  ic int cannotBeF
24480 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
24490 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
244a0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
244b0 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
244c0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
244d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
244e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25  rMsg(pParse, "'%
244f0 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63  s' is not a func
24500 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e  tion", pFrom->zN
24510 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
24520 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
24530 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
24540 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
24550 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57  *.** Argument pW
24560 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62  ith (which may b
24570 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74  e NULL) points t
24580 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  o a linked list 
24590 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49  of nested .** WI
245a0 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f  TH contexts, fro
245b0 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72  m inner to outer
245c0 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62  most. If the tab
245d0 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
245e0 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65   .** FROM clause
245f0 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69   element pItem i
24600 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f  s really a commo
24610 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69  n-table-expressi
24620 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65  on (CTE) .** the
24630 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
24640 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65  er to the CTE de
24650 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61  finition for tha
24660 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69  t table. Otherwi
24670 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c  se.** return NUL
24680 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  L..**.** If a no
24690 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  n-NULL value is 
246a0 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70  returned, set *p
246b0 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e  pContext to poin
246c0 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a  t to the With.**
246d0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
246e0 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65   returned CTE be
246f0 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  longs to..*/.sta
24700 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
24710 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69  searchWith(.  Wi
24720 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24740 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f   Current innermo
24750 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a  st WITH clause *
24760 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
24770 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
24780 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
24790 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65  se element to re
247a0 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20  solve */.  With 
247b0 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20  **ppContext     
247c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
247d0 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72  T: WITH clause r
247e0 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f  eturn value belo
247f0 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63  ngs to */.){.  c
24800 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
24810 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
24820 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28  Database==0 && (
24830 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  zName = pItem->z
24840 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
24850 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72  With *p;.    for
24860 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70  (p=pWith; p; p=p
24870 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20  ->pOuter){.     
24880 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
24890 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
248a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
248b0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
248c0 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69  mp(zName, p->a[i
248d0 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
248e0 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74           *ppCont
248f0 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
24900 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b     return &p->a[
24910 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
24920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
24930 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
24940 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
24950 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61  ator maintains a
24960 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65   stack of active
24970 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a   WITH clauses.**
24980 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d   with the inner-
24990 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
249a0 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f   being at the to
249b0 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
249c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
249d0 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49  ne pushes the WI
249e0 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64  TH clause passed
249f0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
24a00 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20  rgument.** onto 
24a10 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
24a20 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e  tack. If argumen
24a30 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c  t bFree is true,
24a40 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49   then this.** WI
24a50 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e  TH clause will n
24a60 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66  ever be popped f
24a70 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49  rom the stack. I
24a80 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
24a90 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  * should be free
24aa0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
24ab0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49   Parse object. I
24ac0 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77  n other cases, w
24ad0 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c  hen.** bFree==0,
24ae0 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
24af0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
24b00 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45  long with the SE
24b10 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  LECT .** stateme
24b20 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74  nt with which it
24b30 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a   is associated..
24b40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
24b50 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
24b60 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
24b70 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20  th, u8 bFree){. 
24b80 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d   assert( bFree==
24b90 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57  0 || (pParse->pW
24ba0 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65  ith==0 && pParse
24bb0 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30  ->pWithToFree==0
24bc0 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68  ) );.  if( pWith
24bd0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24be0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70  pParse->pWith!=p
24bf0 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74  With );.    pWit
24c00 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72  h->pOuter = pPar
24c10 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
24c20 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
24c30 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46  With;.    if( bF
24c40 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57  ree ) pParse->pW
24c50 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74  ithToFree = pWit
24c60 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h;.  }.}../*.** 
24c70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  This function ch
24c80 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74  ecks if argument
24c90 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f   pFrom refers to
24ca0 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20   a CTE declared 
24cb0 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c  by .** a WITH cl
24cc0 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63  ause on the stac
24cd0 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e  k currently main
24ce0 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61  tained by the pa
24cf0 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66  rser. And,.** if
24d00 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
24d10 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72  ssing a CTE expr
24d20 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  ession, if it is
24d30 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20   a recursive.** 
24d40 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
24d50 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a   current CTE..**
24d60 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c  .** If pFrom fal
24d70 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f  ls into either o
24d80 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f  f the two catego
24d90 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f  ries above, pFro
24da0 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f  m->pTab.** and o
24db0 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
24dc0 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64  populated accord
24dd0 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ingly. The calle
24de0 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a  r should check.*
24df0 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  * (pFrom->pTab!=
24e00 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  0) to determine 
24e10 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
24e20 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63   successful matc
24e30 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a  h.** was found..
24e40 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
24e50 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20   not a match is 
24e60 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  found, SQLITE_OK
24e70 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
24e80 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
24e90 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
24ea0 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65  does occur, an e
24eb0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
24ec0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a  stored in the.**
24ed0 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65   parser and some
24ee0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
24ef0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
24f00 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
24f10 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70  atic int withExp
24f20 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70  and(.  Walker *p
24f30 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63  Walker, .  struc
24f40 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24f50 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65  pFrom.){.  Parse
24f60 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
24f70 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71  er->pParse;.  sq
24f80 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
24f90 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74  se->db;.  struct
24fa0 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20   Cte *pCte;     
24fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
24fc0 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c  ched CTE (or NUL
24fd0 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a  L if no match) *
24fe0 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b  /.  With *pWith;
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25000 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75      /* WITH clau
25010 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c  se that pCte bel
25020 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
25030 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
25040 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20  b==0 );..  pCte 
25050 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61  = searchWith(pPa
25060 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f  rse->pWith, pFro
25070 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66  m, &pWith);.  if
25080 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61  ( pCte ){.    Ta
25090 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45  ble *pTab;.    E
250a0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
250b0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65  .    Select *pSe
250c0 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  l;.    Select *p
250d0 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
250e0 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73       /* Left-mos
250f0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
25100 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d  nt */.    int bM
25110 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20  ayRecursive;    
25120 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
25130 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e  if compound join
25140 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c  ed by UNION [ALL
25150 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70  ] */.    With *p
25160 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20  SavedWith;      
25170 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
25180 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73  l value of pPars
25190 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20  e->pWith */..   
251a0 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74   /* If pCte->zCt
251b0 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  eErr is non-NULL
251c0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
251d0 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20  then this is an 
251e0 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72  illegal.    ** r
251f0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
25200 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20  ce to CTE pCte. 
25210 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  Leave an error i
25220 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
25230 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  urn.    ** early
25240 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  . If pCte->zCteE
25250 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  rr is NULL, then
25260 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   this is not a r
25270 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
25280 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ce..    ** In th
25290 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64  is case, proceed
252a0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  .  */.    if( pC
252b0 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20  te->zCteErr ){. 
252c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
252d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74  rMsg(pParse, pCt
252e0 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65  e->zCteErr, pCte
252f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
25300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
25310 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
25320 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  f( cannotBeFunct
25330 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
25340 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  m) ) return SQLI
25350 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61  TE_ERROR;..    a
25360 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
25370 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
25380 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
25390 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
253a0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
253b0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
253c0 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
253d0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
253e0 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20    pTab->nTabRef 
253f0 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  = 1;.    pTab->z
25400 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
25410 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d  StrDup(db, pCte-
25420 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61  >zName);.    pTa
25430 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
25440 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
25450 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
25460 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
25470 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
25480 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
25490 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
254a0 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69  eral | TF_NoVisi
254b0 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46  bleRowid;.    pF
254c0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
254d0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
254e0 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
254f0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  t, 0);.    if( d
25500 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
25510 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
25520 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
25530 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
25540 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f  Select );..    /
25550 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
25560 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43  is a recursive C
25570 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20  TE. */.    pSel 
25580 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
25590 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73  ;.    bMayRecurs
255a0 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70  ive = ( pSel->op
255b0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c  ==TK_ALL || pSel
255c0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
255d0 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
255e0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
255f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72   int i;.      Sr
25600 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46  cList *pSrc = pF
25610 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  rom->pSelect->pS
25620 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
25630 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
25640 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
25650 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
25660 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
25670 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
25680 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
25690 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20  abase==0 .      
256a0 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61     && pItem->zNa
256b0 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  me!=0 .         
256c0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
256d0 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ICmp(pItem->zNam
256e0 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a  e, pCte->zName).
256f0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
25700 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54         pItem->pT
25710 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
25720 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69       pItem->fg.i
25730 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a  sRecursive = 1;.
25740 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
25750 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20  nTabRef++;.     
25760 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
25770 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73  ags |= SF_Recurs
25780 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ive;.        }. 
25790 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
257a0 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65    /* Only one re
257b0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
257c0 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  e is permitted. 
257d0 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62  */ .    if( pTab
257e0 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20  ->nTabRef>2 ){. 
257f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
25800 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20  rMsg(.          
25810 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c  pParse, "multipl
25820 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
25830 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a  recursive table:
25840 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d   %s", pCte->zNam
25850 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
25860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
25870 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
25880 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54  assert( pTab->nT
25890 61 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20  abRef==1 || .   
258a0 20 20 20 20 20 20 20 20 20 28 28 70 53 65 6c 2d           ((pSel-
258b0 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63  >selFlags&SF_Rec
258c0 75 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d  ursive) && pTab-
258d0 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a  >nTabRef==2 ));.
258e0 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45  .    pCte->zCteE
258f0 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72  rr = "circular r
25900 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20  eference: %s";. 
25910 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20     pSavedWith = 
25920 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
25930 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
25940 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
25950 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
25960 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  ){.      Select 
25970 2a 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e  *pPrior = pSel->
25980 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73  pPrior;.      as
25990 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57  sert( pPrior->pW
259a0 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ith==0 );.      
259b0 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20  pPrior->pWith = 
259c0 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20  pSel->pWith;.   
259d0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
259e0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50  lect(pWalker, pP
259f0 72 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72  rior);.      pPr
25a00 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a  ior->pWith = 0;.
25a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25a20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
25a30 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
25a40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
25a50 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
25a60 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65  th;..    for(pLe
25a70 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e  ft=pSel; pLeft->
25a80 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c  pPrior; pLeft=pL
25a90 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  eft->pPrior);.  
25aa0 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74    pEList = pLeft
25ab0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66  ->pEList;.    if
25ac0 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b  ( pCte->pCols ){
25ad0 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
25ae0 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
25af0 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr!=pCte->pCols-
25b00 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
25b10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
25b20 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
25b30 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65   %s has %d value
25b40 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73  s for %d columns
25b50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
25b60 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69  Cte->zName, pELi
25b70 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d  st->nExpr, pCte-
25b80 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20  >pCols->nExpr.  
25b90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
25ba0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
25bb0 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20   pSavedWith;.   
25bc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25bd0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
25be0 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  }.      pEList =
25bf0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20   pCte->pCols;.  
25c00 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
25c10 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
25c20 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
25c30 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
25c40 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
25c50 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
25c60 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66  sive ){.      if
25c70 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ( pSel->selFlags
25c80 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
25c90 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  ){.        pCte-
25ca0 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74  >zCteErr = "mult
25cb0 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72  iple recursive r
25cc0 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a  eferences: %s";.
25cd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25ce0 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
25cf0 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20  rr = "recursive 
25d00 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73  reference in a s
25d10 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20  ubquery: %s";.  
25d20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
25d30 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
25d40 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
25d50 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43    }.    pCte->zC
25d60 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  teErr = 0;.    p
25d70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
25d80 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a  SavedWith;.  }..
25d90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25da0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
25db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25dc0 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74  T_CTE./*.** If t
25dd0 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64  he SELECT passed
25de0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
25df0 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61  rgument has an a
25e00 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a  ssociated WITH .
25e10 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69  ** clause, pop i
25e20 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  t from the stack
25e30 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
25e40 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  of the Parse obj
25e50 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
25e60 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
25e70 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43   as the xSelectC
25e80 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62  allback2() callb
25e90 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ack by.** sqlite
25ea0 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
25eb0 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53  when walking a S
25ec0 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65  ELECT tree to re
25ed0 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  solve table.** n
25ee0 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46  ames and other F
25ef0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
25f00 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  nts. .*/.static 
25f10 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69  void selectPopWi
25f20 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  th(Walker *pWalk
25f30 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
25f40 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
25f50 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
25f60 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  e;.  if( pParse-
25f70 3e 70 57 69 74 68 20 26 26 20 70 2d 3e 70 50 72  >pWith && p->pPr
25f80 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  ior==0 ){.    Wi
25f90 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64  th *pWith = find
25fa0 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57  Rightmost(p)->pW
25fb0 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69  ith;.    if( pWi
25fc0 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  th!=0 ){.      a
25fd0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
25fe0 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20  With==pWith );. 
25ff0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
26000 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74  th = pWith->pOut
26010 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  er;.    }.  }.}.
26020 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65  #else.#define se
26030 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65  lectPopWith 0.#e
26040 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
26050 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
26060 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
26070 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
26080 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
26090 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
260a0 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
260b0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
260c0 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
260d0 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
260e0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
260f0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
26100 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
26110 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
26120 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
26130 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
26140 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
26150 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
26160 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
26170 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
26180 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
26190 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
261a0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
261b0 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
261c0 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
261d0 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
261e0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
261f0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
26200 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
26210 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
26220 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
26230 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
26240 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
26250 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
26260 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
26270 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
26280 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
26290 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
262a0 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
262b0 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
262c0 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69  ing up the persi
262d0 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
262e0 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
262f0 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
26300 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
26310 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
26320 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
26330 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  mmodate the NATU
26340 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
26350 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
26360 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
26370 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
26380 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
26390 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
263a0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
263b0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
263c0 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
263d0 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
263e0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
263f0 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
26400 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
26410 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
26420 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
26430 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
26440 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
26450 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
26460 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
26470 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
26480 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
26490 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
264a0 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
264b0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
264c0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
264d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
264e0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
264f0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
26500 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
26510 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
26520 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
26530 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
26540 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
26550 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
26560 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
26570 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
26580 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
26590 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20   p->selFlags;.. 
265a0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
265b0 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
265c0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
265d0 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
265e0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
265f0 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  }.  if( NEVER(p-
26600 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65  >pSrc==0) || (se
26610 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
26620 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
26630 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
26640 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
26650 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
26660 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
26670 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 74 68  ;.  if( p->pWith
26680 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   ){.    sqlite3W
26690 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20  ithPush(pParse, 
266a0 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20  p->pWith, 0);.  
266b0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
266c0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
266d0 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
266e0 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69  ned to all entri
266f0 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46  es in.  ** the F
26700 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
26710 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
26720 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  nt..  */.  sqlit
26730 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
26740 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
26750 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20  TabList);..  /* 
26760 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
26770 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ble named in the
26780 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
26790 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a  the select.  If.
267a0 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66    ** an entry of
267b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
267c0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69   is a subquery i
267d0 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c  nstead of a tabl
267e0 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20  e or view,.  ** 
267f0 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72  then create a tr
26800 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
26810 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72  ructure to descr
26820 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ibe the subquery
26830 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
26840 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
26850 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
26860 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
26870 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
26880 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  *pTab;.    asser
26890 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52  t( pFrom->fg.isR
268a0 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70  ecursive==0 || p
268b0 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b  From->pTab!=0 );
268c0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
268d0 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29  fg.isRecursive )
268e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
268f0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
26900 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66  ab==0 );.#ifndef
26910 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
26920 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70  .    if( withExp
26930 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  and(pWalker, pFr
26940 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  om) ) return WRC
26950 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20  _Abort;.    if( 
26960 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d  pFrom->pTab ) {}
26970 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20   else.#endif.   
26980 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
26990 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
269a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
269b0 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63  UERY.      Selec
269c0 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
269d0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
269e0 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
269f0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
26a00 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
26a10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26a20 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sel!=0 );.      
26a30 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
26a40 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
26a50 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  if( sqlite3WalkS
26a60 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
26a70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52  Sel) ) return WR
26a80 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
26a90 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
26aa0 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
26ab0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
26ac0 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
26ad0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
26ae0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
26af0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54  ;.      pTab->nT
26b00 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  abRef = 1;.     
26b10 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
26b20 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
26b30 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22  , "sqlite_sq_%p"
26b40 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
26b50 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
26b60 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
26b70 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
26b80 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ; }.      sqlite
26b90 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
26ba0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
26bb0 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d  l->pEList,&pTab-
26bc0 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f  >nCol,&pTab->aCo
26bd0 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
26be0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
26bf0 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
26c00 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
26c10 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
26c20 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
26c30 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
26c40 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
26c50 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
26c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
26c70 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
26c80 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
26c90 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
26ca0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
26cb0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
26cc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
26cd0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
26ce0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
26cf0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
26d00 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
26d10 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
26d20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
26d30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
26d40 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66  ->nTabRef>=0xfff
26d50 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
26d60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
26d70 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
26d80 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
26d90 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
26da0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
26db0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
26dc0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
26dd0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
26de0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
26df0 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
26e00 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
26e10 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
26e20 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74  (pTab) && cannot
26e30 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  BeFunction(pPars
26e40 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
26e50 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
26e60 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23  Abort;.      }.#
26e70 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
26e80 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
26e90 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
26ea0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
26eb0 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49  BLE).      if( I
26ec0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c  sVirtual(pTab) |
26ed0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
26ee0 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e  ){.        i16 n
26ef0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
26f00 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
26f10 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
26f20 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
26f30 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
26f40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
26f50 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
26f60 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
26f70 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
26f80 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
26f90 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
26fa0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26fb0 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
26fc0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pFrom->pSelect, 
26fd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
26fe0 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61        nCol = pTa
26ff0 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
27000 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31   pTab->nCol = -1
27010 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27020 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
27030 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
27040 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ect);.        pT
27050 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ab->nCol = nCol;
27060 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
27070 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
27080 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
27090 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
270a0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
270b0 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
270c0 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
270d0 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
270e0 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
270f0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
27100 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
27110 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
27120 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
27130 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
27140 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
27150 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
27160 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
27170 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
27180 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
27190 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
271a0 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
271b0 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
271c0 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
271d0 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
271e0 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
271f0 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
27200 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
27210 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
27220 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
27230 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
27240 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
27250 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
27260 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
27270 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
27280 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
27290 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61  K_ASTERISK opera
272a0 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
272b0 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
272c0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a  n the column.  *
272d0 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c  * list.  The fol
272e0 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
272f0 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
27300 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  he TK_ASTERISK. 
27310 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
27320 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20  and expand each 
27330 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
27340 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
27350 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65  n.  ** all table
27360 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
27370 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
27380 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
27390 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
273a0 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
273b0 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
273c0 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
273d0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
273e0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
273f0 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
27400 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
27410 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
27420 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b  STERISK ) break;
27430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
27440 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
27450 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
27460 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
27470 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
27480 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
27490 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
274a0 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
274b0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
274c0 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
274d0 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
274e0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
274f0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
27500 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
27510 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
27520 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
27530 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
27540 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
27550 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
27560 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
27570 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
27580 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
27590 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
275a0 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
275b0 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
275c0 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
275d0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
275e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
275f0 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
27600 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
27610 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
27620 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
27630 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
27640 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
27650 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
27660 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27680 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
27690 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
276a0 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
276b0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
276c0 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
276d0 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d  .      pE = a[k]
276e0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52  .pExpr;.      pR
276f0 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68  ight = pE->pRigh
27700 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
27710 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
27720 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  || pRight!=0 );.
27730 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
27740 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20  !=TK_ASTERISK.  
27750 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21       && (pE->op!
27760 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
27770 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49  t->op!=TK_ASTERI
27780 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  SK).      ){.   
27790 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
277a0 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
277b0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
277c0 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
277d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
277e0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
277f0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
27800 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
27810 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [k].pExpr);.    
27820 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
27830 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
27840 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
27850 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
27860 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
27870 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
27880 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b  pr-1].zSpan = a[
27890 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  k].zSpan;.      
278a0 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
278b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b   0;.          a[
278c0 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20  k].zSpan = 0;.  
278d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
278e0 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
278f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27900 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
27910 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
27920 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
27930 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
27940 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
27950 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
27960 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
27970 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
27980 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
27990 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
279a0 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d    char *zTName =
279b0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78   0;       /* tex
279c0 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
279d0 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
279e0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
279f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
27a00 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
27a10 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
27a20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
27a30 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
27a40 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
27a50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
27a60 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
27a70 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
27a80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
27a90 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
27aa0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
27ab0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
27ac0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
27ad0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
27ae0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
27af0 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
27b00 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pSub = pFrom->
27b10 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
27b20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
27b30 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
27b40 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  s;.          con
27b50 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
27b60 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
27b70 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
27b80 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
27b90 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
27ba0 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
27bb0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
27bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27bd0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
27be0 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
27bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27c00 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62  pSub==0 || (pSub
27c10 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27c20 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29  NestedFrom)==0 )
27c30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
27c40 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ub = 0;.        
27c50 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
27c60 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
27c70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
27c80 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
27c90 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
27ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27cb0 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d             iDb =
27cc0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
27cd0 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
27ce0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
27cf0 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
27d00 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d  e = iDb>=0 ? db-
27d10 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
27d20 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20  me : "*";.      
27d30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27d40 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
27d50 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
27d60 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
27d70 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
27d80 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l[j].zName;.    
27d90 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43          char *zC
27da0 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20  olname;  /* The 
27db0 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  computed column 
27dc0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
27dd0 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65      char *zToFre
27de0 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64  e;   /* Malloced
27df0 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65   string that nee
27e00 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ds to be freed *
27e10 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f  /.            To
27e20 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ken sColname;  /
27e30 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  * Computed colum
27e40 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65  n name as a toke
27e50 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20  n */..          
27e60 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20    assert( zName 
27e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
27e80 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75  f( zTName && pSu
27e90 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  b.             &
27ea0 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70  & sqlite3MatchSp
27eb0 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c  anName(pSub->pEL
27ec0 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c  ist->a[j].zSpan,
27ed0 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d   0, zTName, 0)==
27ee0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  0.            ){
27ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
27f00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
27f10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
27f20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
27f30 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
27f40 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69  'hidden', omit i
27f50 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e  t from the expan
27f60 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
27f70 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
27f80 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45  st unless the SE
27f90 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f  LECT has the SF_
27fa0 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20  IncludeHidden.  
27fb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74            ** bit
27fc0 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20   set..          
27fd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
27fe0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
27ff0 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69  s & SF_IncludeHi
28000 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20  dden)==0.       
28010 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65        && IsHidde
28020 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
28030 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20  Col[j]) .       
28040 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
28050 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
28060 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28070 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
28080 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  een = 1;..      
28090 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
280a0 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
280b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
280c0 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pFrom->fg.joint
280d0 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
280e0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
280f0 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64       && tableAnd
28100 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  ColumnIndex(pTab
28110 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  List, i, zName, 
28120 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20  0, 0).          
28130 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
28140 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
28150 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
28160 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
28170 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
28190 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67  table to the rig
281a0 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ht of the join *
281b0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
281c0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
281d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
281e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
281f0 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
28200 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20  (pFrom->pUsing, 
28210 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28230 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
28240 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
28250 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
28260 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
28270 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
28280 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
28290 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
282a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
282b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
282c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
282d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
282e0 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
282f0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
28300 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20  TK_ID, zName);. 
28310 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
28320 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
28330 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
28340 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
28350 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
28360 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
28370 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
28380 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
28390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
283a0 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
283b0 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
283c0 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
283d0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
283e0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
283f0 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
28400 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
28410 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
28420 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20  SchemaName ){.  
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
28440 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
28450 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63  r(db, TK_ID, zSc
28460 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20  hemaName);.     
28470 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
28480 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
28490 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
284a0 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20  pLeft, pExpr);. 
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
284d0 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
284f0 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  olname = sqlite3
28500 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
28510 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
28520 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
28530 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
28540 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
28550 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28560 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28570 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
28580 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
28590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
285a0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
285b0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
285c0 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
285d0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
285e0 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
285f0 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c  nInit(&sColname,
28600 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
28610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28620 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
28630 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43  Parse, pNew, &sC
28640 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  olname, 0);.    
28650 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
28660 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
28670 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
28680 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28690 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
286a0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d  rList_item *pX =
286b0 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e   &pNew->a[pNew->
286c0 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20  nExpr-1];.      
286d0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
286e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
286f0 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
28700 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
28710 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
28720 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[j].zSpan);. 
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
28740 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
28750 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
28760 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
28780 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
28790 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
287a0 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20  .%s.%s",.       
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c      zSchemaName,
287e0 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e   zTabName, zColn
287f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
28800 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28810 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
28840 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31  ->bSpanIsTab = 1
28850 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
28860 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28870 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
28880 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  oFree);.        
28890 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
288a0 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
288b0 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
288c0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
288d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
288e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
288f0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
28900 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
28910 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
28920 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
28930 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28940 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
28950 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
28960 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28970 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28980 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
28990 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
289a0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d   pEList);.    p-
289b0 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
289c0 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
289d0 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
289e0 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
289f0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
28a00 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
28a10 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
28a20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
28a30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
28a40 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
28a50 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
28a60 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
28a70 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  bort;.  }.#endif
28a80 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
28a90 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
28aa0 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
28ab0 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
28ac0 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20  e walker..**.** 
28ad0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
28ae0 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e  e is the Walker.
28af0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
28b00 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  en expression tr
28b10 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65  ees.** are walke
28b20 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63  d without any ac
28b30 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65  tions being take
28b40 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20  n at each node. 
28b50 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20   Presumably,.** 
28b60 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
28b70 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61  e is used for Wa
28b80 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
28b90 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b  ck then .** Walk
28ba0 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
28bb0 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20  ck is set to do 
28bc0 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c  something useful
28bd0 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73   for every .** s
28be0 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
28bf0 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69  arser tree..*/.i
28c00 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61  nt sqlite3ExprWa
28c10 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
28c20 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f  otUsed, Expr *No
28c30 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
28c40 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
28c50 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
28c60 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
28c70 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
28c80 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
28c90 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
28ca0 65 20 77 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c  e walker for SEL
28cb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
28cc0 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
28cd0 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
28ce0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
28cf0 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  lectWalkNoop(Wal
28d00 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65  ker *NotUsed, Se
28d10 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b  lect *NotUsed2){
28d20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
28d30 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
28d40 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
28d50 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
28d60 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  }..#if SQLITE_DE
28d70 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73  BUG./*.** Always
28d80 20 61 73 73 65 72 74 2e 20 20 54 68 69 73 20 78   assert.  This x
28d90 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
28da0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
28db0 72 6f 76 65 73 20 74 68 61 74 20 74 68 65 0a 2a  roves that the.*
28dc0 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  * xSelectCallbac
28dd0 6b 32 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f  k2 is never invo
28de0 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ked..*/.void sql
28df0 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
28e00 73 65 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f  sert2(Walker *No
28e10 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e  tUsed, Select *N
28e20 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
28e30 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
28e40 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
28e50 3b 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  ;.  assert( 0 );
28e60 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20  .}.#endif./*.** 
28e70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
28e80 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
28e90 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
28ea0 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
28eb0 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
28ec0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
28ed0 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
28ee0 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
28ef0 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
28f00 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
28f10 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
28f20 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
28f30 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
28f40 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
28f50 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
28f60 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
28f70 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
28f80 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
28f90 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
28fa0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28fb0 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
28fc0 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
28fd0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
28fe0 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
28ff0 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
29000 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
29010 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
29020 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
29030 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
29040 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
29050 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
29060 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
29070 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
29080 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
29090 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
290a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
290b0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
290c0 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
290d0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
290e0 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
290f0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
29100 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
29110 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
29120 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
29130 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
29140 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
29150 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
29160 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
29170 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
29180 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63  ry;.    w.xSelec
29190 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
291a0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
291b0 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
291c0 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c  t);.  }.  w.xSel
291d0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
291e0 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
291f0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
29200 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69  k2 = selectPopWi
29210 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  th;.  sqlite3Wal
29220 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
29230 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
29240 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
29250 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
29260 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
29270 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
29280 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
29290 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
292a0 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
292b0 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
292c0 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
292d0 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
292e0 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
292f0 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
29300 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
29310 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
29320 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
29330 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
29340 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
29350 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
29360 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
29370 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
29380 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
29390 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
293a0 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
293b0 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
293c0 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
293d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
293e0 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
293f0 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
29400 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
29410 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
29420 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
29430 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
29440 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
29450 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
29460 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29470 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
29480 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
29490 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
294a0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
294b0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
294c0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
294d0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
294e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
294f0 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
29500 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
29510 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73  Resolved );.  as
29520 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
29530 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
29540 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  nfo)==0 );.  p->
29550 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
29560 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50  asTypeInfo;.  pP
29570 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
29580 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69  pParse;.  pTabLi
29590 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
295a0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
295b0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
295c0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
295d0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
295e0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
295f0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
29600 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
29610 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
29620 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
29630 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
29640 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
29650 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
29660 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
29670 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65  LECT */.      Se
29680 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
29690 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
296a0 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
296b0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
296c0 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
296d0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
296e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
296f0 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
29700 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
29710 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
29720 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
29730 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
29740 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
29750 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
29760 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
29770 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
29780 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
29790 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
297a0 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
297b0 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
297c0 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
297d0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
297e0 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
297f0 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
29800 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
29810 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
29820 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
29830 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
29840 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
29850 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29860 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
29870 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
29880 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
29890 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
298a0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65  kNoop;.  w.xSele
298b0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
298c0 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
298d0 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
298e0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
298f0 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
29900 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
29910 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
29920 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
29930 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
29940 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
29950 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
29960 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29970 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
29980 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
29990 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
299a0 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
299b0 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
299c0 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
299d0 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
299e0 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
299f0 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
29a00 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
29a10 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
29a20 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
29a30 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
29a40 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
29a50 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
29a60 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
29a70 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
29a80 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
29a90 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
29aa0 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
29ab0 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
29ac0 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
29ad0 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
29ae0 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
29af0 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
29b00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
29b10 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
29b20 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
29b30 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
29b40 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
29b50 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
29b60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
29b70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
29b80 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
29b90 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
29ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29bb0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29bc0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
29bd0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
29be0 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
29bf0 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
29c00 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
29c10 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
29c20 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
29c30 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
29c40 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
29c50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29c60 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
29c70 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
29c80 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
29c90 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
29ca0 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
29cb0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
29cc0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
29cd0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
29ce0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
29cf0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
29d00 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
29d10 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
29d20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
29d30 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
29d40 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
29d50 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
29d60 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
29d70 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
29d80 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
29d90 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
29da0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
29db0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
29dc0 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
29dd0 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
29de0 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
29df0 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
29e00 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
29e10 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
29e20 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
29e30 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
29e40 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
29e50 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
29e60 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
29e70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
29e80 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
29e90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
29ea0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
29eb0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
29ec0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
29ed0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
29ee0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
29ef0 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d  nc;.  int nReg =
29f00 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
29f10 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   + pAggInfo->nCo
29f20 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  lumn;.  if( nReg
29f30 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
29f40 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
29f50 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
29f60 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72  at all AggInfo r
29f70 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74  egisters are wit
29f80 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70  hin the range sp
29f90 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20  ecified by.  ** 
29fa0 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41  AggInfo.mnReg..A
29fb0 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a  ggInfo.mxReg */.
29fc0 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d    assert( nReg==
29fd0 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d  pAggInfo->mxReg-
29fe0 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b  pAggInfo->mnReg+
29ff0 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1 );.  for(i=0; 
2a000 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
2a010 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  umn; i++){.    a
2a020 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
2a030 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  >aCol[i].iMem>=p
2a040 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
2a050 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
2a060 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
2a070 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
2a080 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  eg );.  }.  for(
2a090 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
2a0a0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  >nFunc; i++){.  
2a0b0 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
2a0c0 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
2a0d0 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
2a0e0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
2a0f0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
2a100 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
2a110 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23  ->mxReg );.  }.#
2a120 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
2a130 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2a140 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
2a150 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e  o->mnReg, pAggIn
2a160 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f  fo->mxReg);.  fo
2a170 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
2a180 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
2a190 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2a1a0 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
2a1b0 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69      if( pFunc->i
2a1c0 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
2a1d0 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
2a1e0 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20  pFunc->pExpr;.  
2a1f0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2a200 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
2a210 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2a220 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
2a230 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  x.pList==0 || pE
2a240 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2a250 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
2a260 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2a270 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
2a280 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74   aggregates must
2a290 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e   have exactly on
2a2a0 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
2a2b0 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20  argument");.    
2a2c0 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
2a2d0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
2a2e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a2f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2a300 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
2a310 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2a320 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20  pE->x.pList, 0, 
2a330 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
2a340 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2a350 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2a360 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
2a370 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
2a3a0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2a3b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a3c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
2a3d0 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
2a3e0 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
2a3f0 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
2a400 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
2a410 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
2a420 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
2a430 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
2a440 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
2a450 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
2a460 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2a470 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2a480 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2a490 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
2a4a0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
2a4b0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
2a4c0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
2a4d0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2a4e0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
2a4f0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2a500 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
2a510 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
2a520 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2a530 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
2a540 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2a550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a560 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp2(v, OP_AggF
2a570 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
2a580 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
2a590 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73  Expr : 0);.    s
2a5a0 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
2a5b0 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c  P4(v, pF->pFunc,
2a5c0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
2a5d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
2a5e0 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
2a5f0 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  r memory cells f
2a600 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  or an aggregate 
2a610 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
2a620 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
2a630 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
2a640 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63  ic void updateAc
2a650 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
2a660 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
2a670 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2a680 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2a690 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2a6a0 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20  .  int regHit = 
2a6b0 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74  0;.  int addrHit
2a6c0 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  Test = 0;.  stru
2a6d0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2a6e0 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
2a6f0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
2a700 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
2a710 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
2a720 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
2a730 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
2a740 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2a750 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
2a760 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
2a770 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
2a780 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
2a790 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
2a7a0 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
2a7b0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
2a7c0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2a7d0 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
2a7e0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2a7f0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
2a800 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
2a810 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
2a820 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
2a830 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
2a840 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
2a850 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2a860 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
2a870 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
2a880 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43  gg, 0, SQLITE_EC
2a890 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c  EL_DUP);.    }el
2a8a0 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  se{.      nArg =
2a8b0 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67   0;.      regAgg
2a8c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
2a8d0 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  if( pF->iDistinc
2a8e0 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  t>=0 ){.      ad
2a8f0 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
2a900 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2a910 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2a920 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a  ( nArg==0 );  /*
2a930 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   Error condition
2a940 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
2a950 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20  se( nArg>1 );   
2a960 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72  /* Also an error
2a970 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69   */.      codeDi
2a980 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
2a990 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
2a9a0 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67  drNext, 1, regAg
2a9b0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  g);.    }.    if
2a9c0 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  ( pF->pFunc->fun
2a9d0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
2a9e0 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
2a9f0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
2aa00 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
2aa10 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2aa20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2aa30 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
2aa40 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
2aa50 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
2aa60 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68  0 if pF->pFunc h
2aa70 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20  as NEEDCOLL */. 
2aa80 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
2aa90 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
2aaa0 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
2aab0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
2aac0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
2aad0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2aae0 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
2aaf0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
2ab00 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
2ab10 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
2ab20 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
2ab30 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2ab40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
2ab50 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49  gHit==0 && pAggI
2ab60 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
2ab70 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70  r ) regHit = ++p
2ab80 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2ab90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2aba0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
2abb0 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30  eq, regHit, 0, 0
2abc0 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
2abd0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
2abe0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
2abf0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2ac00 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67  AggStep0, 0, reg
2ac10 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a  Agg, pF->iMem);.
2ac20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ac30 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70  ppendP4(v, pF->p
2ac40 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
2ac50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2ac60 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
2ac70 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  8)nArg);.    sql
2ac80 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
2ac90 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
2aca0 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
2acb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
2acc0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
2acd0 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
2ace0 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Arg);.    if( ad
2acf0 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
2ad00 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2ad10 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
2ad20 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ext);.      sqli
2ad30 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2ad40 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
2ad50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
2ad60 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65  e populating the
2ad70 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
2ad80 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68  isters, clear th
2ad90 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
2ada0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
2adb0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65  if any of the re
2adc0 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61  quired column va
2add0 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79  lues are already
2ade0 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69   present .  ** i
2adf0 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c  n registers, sql
2ae00 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d  ite3ExprCode() m
2ae10 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20  ay use OP_SCopy 
2ae20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75  to copy the valu
2ae30 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d  e.  ** to pC->iM
2ae40 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74  em. But by the t
2ae50 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73  ime the value is
2ae60 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69   used, the origi
2ae70 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a  nal register.  *
2ae80 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  * may have been 
2ae90 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69  used, invalidati
2aea0 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ng the underlyin
2aeb0 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67  g buffer holding
2aec0 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f   the.  ** text o
2aed0 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65  r blob value. Se
2aee0 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34  e ticket [883034
2aef0 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dcb5]..  **.  **
2af00 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f   Another solutio
2af10 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68  n would be to ch
2af20 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70  ange the OP_SCop
2af30 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63  y used to copy c
2af40 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65  ached.  ** value
2af50 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e  s to an OP_Copy.
2af60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48  .  */.  if( regH
2af70 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69  it ){.    addrHi
2af80 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  tTest = sqlite3V
2af90 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2afa0 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62  If, regHit); Vdb
2afb0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2afc0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
2afd0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2afe0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
2aff0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
2b000 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
2b010 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
2b020 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
2b030 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2b040 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
2b050 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
2b060 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2b070 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ode = 0;.  sqlit
2b080 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2b090 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
2b0a0 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20  addrHitTest ){. 
2b0b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2b0c0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69  mpHere(v, addrHi
2b0d0 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tTest);.  }.}../
2b0e0 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
2b0f0 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
2b100 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
2b110 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
2b120 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
2b130 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
2b140 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2b150 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
2b160 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b170 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
2b180 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
2b190 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
2b1a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2b1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2b1c0 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
2b1d0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1f0 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
2b200 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
2b210 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b230 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
2b240 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
2b250 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
2b260 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
2b270 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  ==2 ){.    int b
2b280 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30  Cover = (pIdx!=0
2b290 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
2b2a0 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72  ab) || !IsPrimar
2b2b0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29  yKeyIndex(pIdx))
2b2c0 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71  );.    char *zEq
2b2d0 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  p = sqlite3MPrin
2b2e0 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
2b2f0 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25  SCAN TABLE %s%s%
2b300 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
2b310 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
2b320 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e   bCover ? " USIN
2b330 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
2b340 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20   " : "",.       
2b350 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e   bCover ? pIdx->
2b360 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29  zName : "".    )
2b370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2b380 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
2b390 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20   pParse->pVdbe, 
2b3a0 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
2b3b0 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
2b3c0 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59  , 0, zEqp, P4_DY
2b3d0 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d  NAMIC.    );.  }
2b3e0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
2b3f0 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  e explainSimpleC
2b400 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64  ount(a,b,c).#end
2b410 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78  if../*.** Contex
2b420 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 68 61 76  t object for hav
2b430 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62  ingToWhereExprCb
2b440 28 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 48 61  ()..*/.struct Ha
2b450 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20 7b  vingToWhereCtx {
2b460 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72  .  Expr **ppWher
2b470 65 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e;.  ExprList *p
2b480 47 72 6f 75 70 42 79 3b 0a 7d 3b 0a 0a 2f 2a 0a  GroupBy;.};../*.
2b490 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ** sqlite3WalkEx
2b4a0 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73  pr() callback us
2b4b0 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57 68  ed by havingToWh
2b4c0 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ere()..**.** If 
2b4d0 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64 20  the node passed 
2b4e0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
2b4f0 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65  is a TK_AND node
2b500 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43  , return .** WRC
2b510 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c  _Continue to tel
2b520 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  l sqlite3WalkExp
2b530 72 28 29 20 74 6f 20 69 74 65 72 61 74 65 20 74  r() to iterate t
2b540 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f 64  hrough child nod
2b550 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
2b560 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43 5f  ise, return WRC_
2b570 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20 63  Prune. In this c
2b580 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20  ase, also check 
2b590 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65  if the .** sub-e
2b5a0 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65  xpression matche
2b5b0 73 20 74 68 65 20 63 72 69 74 65 72 69 61 20 66  s the criteria f
2b5c0 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74  or being moved t
2b5d0 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63  o the WHERE.** c
2b5e0 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61 64  lause. If so, ad
2b5f0 64 20 69 74 20 74 6f 20 74 68 65 20 57 48 45 52  d it to the WHER
2b600 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65 70  E clause and rep
2b610 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65 78 70  lace the sub-exp
2b620 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69  ression.** withi
2b630 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70  n the HAVING exp
2b640 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20 63  ression with a c
2b650 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a  onstant "1"..*/.
2b660 73 74 61 74 69 63 20 69 6e 74 20 68 61 76 69 6e  static int havin
2b670 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28 57  gToWhereExprCb(W
2b680 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2b690 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2b6a0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
2b6b0 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 73 74 72  K_AND ){.    str
2b6c0 75 63 74 20 48 61 76 69 6e 67 54 6f 57 68 65 72  uct HavingToWher
2b6d0 65 43 74 78 20 2a 70 20 3d 20 70 57 61 6c 6b 65  eCtx *p = pWalke
2b6e0 72 2d 3e 75 2e 70 48 61 76 69 6e 67 43 74 78 3b  r->u.pHavingCtx;
2b6f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2b700 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
2b710 47 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d  GroupBy(pWalker-
2b720 3e 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  >pParse, pExpr, 
2b730 70 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a  p->pGroupBy) ){.
2b740 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2b750 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  b = pWalker->pPa
2b760 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45  rse->db;.      E
2b770 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
2b780 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
2b790 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
2b7a0 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
2b7b0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
2b7c0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
2b7d0 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20   Expr *pWhere = 
2b7e0 2a 28 70 2d 3e 70 70 57 68 65 72 65 29 3b 0a 20  *(p->ppWhere);. 
2b7f0 20 20 20 20 20 20 20 53 57 41 50 28 45 78 70 72         SWAP(Expr
2b800 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29  , *pNew, *pExpr)
2b810 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
2b820 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2b830 64 62 2c 20 70 57 68 65 72 65 2c 20 70 4e 65 77  db, pWhere, pNew
2b840 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 70 2d 3e  );.        *(p->
2b850 70 70 57 68 65 72 65 29 20 3d 20 70 4e 65 77 3b  ppWhere) = pNew;
2b860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b870 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2b880 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
2b890 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2b8a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
2b8b0 72 20 65 6c 69 67 69 62 6c 65 20 74 65 72 6d 73  r eligible terms
2b8c0 20 66 72 6f 6d 20 74 68 65 20 48 41 56 49 4e 47   from the HAVING
2b8d0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71 75 65   clause of a que
2b8e0 72 79 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ry, which is.** 
2b8f0 70 72 6f 63 65 73 73 65 64 20 61 66 74 65 72 20  processed after 
2b900 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68 65  grouping, to the
2b910 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 77   WHERE clause, w
2b920 68 69 63 68 20 69 73 20 70 72 6f 63 65 73 73 65  hich is processe
2b930 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75  d before.** grou
2b940 70 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ping. For exampl
2b950 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  e, the query:.**
2b960 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
2b970 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45  ROM <tables> WHE
2b980 52 45 20 61 3d 3f 20 47 52 4f 55 50 20 42 59 20  RE a=? GROUP BY 
2b990 62 20 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44  b HAVING b=? AND
2b9a0 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62   c=?.**.** can b
2b9b0 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 3a 0a  e rewritten as:.
2b9c0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
2b9d0 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57   FROM <tables> W
2b9e0 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f  HERE a=? AND b=?
2b9f0 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
2ba00 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74  NG c=?.**.** A t
2ba10 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e  erm of the HAVIN
2ba20 47 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  G expression is 
2ba30 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 74 72 61  eligible for tra
2ba40 6e 73 66 65 72 20 69 66 20 69 74 20 63 6f 6e 73  nsfer if it cons
2ba50 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79  ists.** entirely
2ba60 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e   of constants an
2ba70 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  d expressions th
2ba80 61 74 20 61 72 65 20 61 6c 73 6f 20 47 52 4f 55  at are also GROU
2ba90 50 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 0a  P BY terms that.
2baa0 2a 2a 20 75 73 65 20 74 68 65 20 22 42 49 4e 41  ** use the "BINA
2bab0 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  RY" collation se
2bac0 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
2bad0 63 20 76 6f 69 64 20 68 61 76 69 6e 67 54 6f 57  c void havingToW
2bae0 68 65 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70  here(.  Parse *p
2baf0 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
2bb00 74 20 2a 70 47 72 6f 75 70 42 79 2c 0a 20 20 45  t *pGroupBy,.  E
2bb10 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 0a 20  xpr *pHaving, . 
2bb20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 0a   Expr **ppWhere.
2bb30 29 7b 0a 20 20 73 74 72 75 63 74 20 48 61 76 69  ){.  struct Havi
2bb40 6e 67 54 6f 57 68 65 72 65 43 74 78 20 73 43 74  ngToWhereCtx sCt
2bb50 78 3b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c  x;.  Walker sWal
2bb60 6b 65 72 3b 0a 0a 20 20 73 43 74 78 2e 70 70 57  ker;..  sCtx.ppW
2bb70 68 65 72 65 20 3d 20 70 70 57 68 65 72 65 3b 0a  here = ppWhere;.
2bb80 20 20 73 43 74 78 2e 70 47 72 6f 75 70 42 79 20    sCtx.pGroupBy 
2bb90 3d 20 70 47 72 6f 75 70 42 79 3b 0a 0a 20 20 6d  = pGroupBy;..  m
2bba0 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20  emset(&sWalker, 
2bbb0 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65  0, sizeof(sWalke
2bbc0 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70  r));.  sWalker.p
2bbd0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2bbe0 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
2bbf0 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e 67  allback = having
2bc00 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a 20  ToWhereExprCb;. 
2bc10 20 73 57 61 6c 6b 65 72 2e 75 2e 70 48 61 76 69   sWalker.u.pHavi
2bc20 6e 67 43 74 78 20 3d 20 26 73 43 74 78 3b 0a 20  ngCtx = &sCtx;. 
2bc30 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2bc40 28 26 73 57 61 6c 6b 65 72 2c 20 70 48 61 76 69  (&sWalker, pHavi
2bc50 6e 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ng);.}../*.** Ch
2bc60 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2bc70 65 20 70 54 68 69 73 20 65 6e 74 72 79 20 6f 66  e pThis entry of
2bc80 20 70 54 61 62 4c 69 73 74 20 69 73 20 61 20 73   pTabList is a s
2bc90 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72  elf-join of a pr
2bca0 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20  ior view..** If 
2bcb0 69 74 20 69 73 2c 20 74 68 65 6e 20 72 65 74 75  it is, then retu
2bcc0 72 6e 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69  rn the SrcList_i
2bcd0 74 65 6d 20 66 6f 72 20 74 68 65 20 70 72 69 6f  tem for the prio
2bce0 72 20 76 69 65 77 2e 20 20 49 66 20 69 74 20 69  r view.  If it i
2bcf0 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72  s not,.** then r
2bd00 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
2bd10 69 63 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  ic struct SrcLis
2bd20 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f  t_item *isSelfJo
2bd30 69 6e 56 69 65 77 28 0a 20 20 53 72 63 4c 69 73  inView(.  SrcLis
2bd40 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
2bd50 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2bd60 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20   for self-joins 
2bd70 69 6e 20 74 68 69 73 20 46 52 4f 4d 20 63 6c 61  in this FROM cla
2bd80 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
2bd90 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
2bda0 68 69 73 20 20 20 2f 2a 20 53 65 61 72 63 68 20  his   /* Search 
2bdb0 66 6f 72 20 70 72 69 6f 72 20 72 65 66 65 72 65  for prior refere
2bdc0 6e 63 65 20 74 6f 20 74 68 69 73 20 73 75 62 71  nce to this subq
2bdd0 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  uery */.){.  str
2bde0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2bdf0 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70   *pItem;.  for(p
2be00 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d  Item = pTabList-
2be10 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68 69 73 3b  >a; pItem<pThis;
2be20 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
2be30 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
2be40 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
2be50 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2be60 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
2be70 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2be80 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
2be90 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2bea0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2beb0 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a  stricmp(pItem->z
2bec0 44 61 74 61 62 61 73 65 2c 20 70 54 68 69 73 2d  Database, pThis-
2bed0 3e 7a 44 61 74 61 62 61 73 65 29 21 3d 30 20 29  >zDatabase)!=0 )
2bee0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2bef0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2bf00 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
2bf10 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d   pThis->zName)!=
2bf20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2bf30 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2bf40 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a 20 20 20  rCompare(0, .   
2bf50 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 53         pThis->pS
2bf60 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70  elect->pWhere, p
2bf70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
2bf80 57 68 65 72 65 2c 20 2d 31 29 20 0a 20 20 20 20  Where, -1) .    
2bf90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2bfa0 76 69 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65  view was modifie
2bfb0 64 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20  d by some other 
2bfc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63  optimization suc
2bfd0 68 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75  h as.      ** pu
2bfe0 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
2bff0 28 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  () */.      cont
2c000 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
2c010 72 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20  return pItem;.  
2c020 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2c030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
2c040 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d  OUNTOFVIEW_OPTIM
2c050 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74  IZATION./*.** At
2c060 74 65 6d 70 74 20 74 6f 20 74 72 61 6e 73 66 6f  tempt to transfo
2c070 72 6d 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  rm a query of th
2c080 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
2c090 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2c0a0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
2c0b0 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t1 UNION ALL
2c0c0 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
2c0d0 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68  2).**.** Into th
2c0e0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
2c0f0 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  ECT (SELECT coun
2c100 74 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28 53  t(*) FROM t1)+(S
2c110 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2c120 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68  ROM t2).**.** Th
2c130 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
2c140 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 61   only works if a
2c150 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
2c160 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
2c170 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62  .**   *  The sub
2c180 71 75 65 72 79 20 69 73 20 61 20 55 4e 49 4f 4e  query is a UNION
2c190 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d   ALL of two or m
2c1a0 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a  ore terms.**   *
2c1b0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48    There is no WH
2c1c0 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20  ERE or GROUP BY 
2c1d0 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  or HAVING clause
2c1e0 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72  s on the subquer
2c1f0 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  ies.**   *  The 
2c200 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61  outer query is a
2c210 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29   simple count(*)
2c220 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  .**.** Return TR
2c230 55 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  UE if the optimi
2c240 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 74  zation is undert
2c250 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aken..*/.static 
2c260 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f  int countOfViewO
2c270 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73  ptimization(Pars
2c280 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2c290 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20  t *p){.  Select 
2c2a0 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a  *pSub, *pPrior;.
2c2b0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
2c2c0 20 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20   Expr *pCount;. 
2c2d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2c2e0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
2c2f0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2c300 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2c310 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
2c320 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69  aggregate */.  i
2c330 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
2c340 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
2c350 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c360 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75 6c   /* Single resul
2c370 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45  t column */.  pE
2c380 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
2c390 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
2c3a0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
2c3b0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
2c3c0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2c3d0 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 6e   /* Result is an
2c3e0 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
2c3f0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2c400 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
2c410 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20 72  ken,"count") ) r
2c420 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20  eturn 0;  /* Is 
2c430 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28  count() */.  if(
2c440 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21   pExpr->x.pList!
2c450 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c470 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28  * Must be count(
2c480 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  *) */.  if( p->p
2c490 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
2c4a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2c4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2c4c0 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20   table in FROM  
2c4d0 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  */.  pSub = p->p
2c4e0 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
2c4f0 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30  t;.  if( pSub==0
2c500 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c520 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
2c530 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  OM is a subquery
2c540 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
2c550 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
2c560 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2c570 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2c580 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79  be a compound ry
2c590 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66   */.  do{.    if
2c5a0 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41  ( pSub->op!=TK_A
2c5b0 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69  LL && pSub->pPri
2c5c0 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
2c5d0 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e  /* Must be UNION
2c5e0 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20   ALL */.    if( 
2c5f0 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20 72  pSub->pWhere ) r
2c600 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c620 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   No WHERE clause
2c630 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
2c640 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2c650 41 67 67 72 65 67 61 74 65 20 29 20 72 65 74 75  Aggregate ) retu
2c660 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  rn 0;     /* Not
2c670 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2c680 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53 75 62  .    pSub = pSub
2c690 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20  ->pPrior;       
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6b0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65 61 74         /* Repeat
2c6c0 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a   over compound *
2c6d0 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53 75 62  /.  }while( pSub
2c6e0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
2c6f0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
2c700 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 74   then it is OK t
2c710 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 74 72  o perform the tr
2c720 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a  ansformation */.
2c730 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2c740 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70  db;.  pCount = p
2c750 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
2c760 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  0;.  pSub = p->p
2c770 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
2c780 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  t;.  p->pSrc->a[
2c790 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  0].pSelect = 0;.
2c7a0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
2c7b0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
2c7c0 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d  rc);.  p->pSrc =
2c7d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2c7e0 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
2c7f0 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63   sizeof(*p->pSrc
2c800 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 75  ));.  while( pSu
2c810 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  b ){.    Expr *p
2c820 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72  Term;.    pPrior
2c830 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b   = pSub->pPrior;
2c840 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72 69 6f  .    pSub->pPrio
2c850 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d  r = 0;.    pSub-
2c860 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
2c870 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSub->selFlags |
2c880 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a  = SF_Aggregate;.
2c890 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
2c8a0 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
2c8b0 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53  nd;.    pSub->nS
2c8c0 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
2c8d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2c8e0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
2c8f0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
2c900 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20  Term = pPrior ? 
2c910 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
2c920 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20  b, pCount, 0) : 
2c930 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75 62  pCount;.    pSub
2c940 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
2c950 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
2c960 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 65 72  (pParse, 0, pTer
2c970 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  m);.    pTerm = 
2c980 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2c990 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20  rse, TK_SELECT, 
2c9a0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
2c9b0 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74  e3PExprAddSelect
2c9c0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
2c9d0 70 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70  pSub);.    if( p
2c9e0 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Expr==0 ){.     
2c9f0 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a   pExpr = pTerm;.
2ca00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ca10 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
2ca20 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2ca30 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70 45  _PLUS, pTerm, pE
2ca40 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
2ca50 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pSub = pPrior;. 
2ca60 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   }.  p->pEList->
2ca70 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  a[0].pExpr = pEx
2ca80 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  pr;.  p->selFlag
2ca90 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61  s &= ~SF_Aggrega
2caa0 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  te;..#if SELECTT
2cab0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2cac0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2cad0 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
2cae0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2caf0 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
2cb00 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66  ("After count-of
2cb10 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61 74 69  -view optimizati
2cb20 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  on:\n"));.    sq
2cb30 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2cb40 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2cb50 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2cb60 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
2cb70 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56   SQLITE_COUNTOFV
2cb80 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IEW_OPTIMIZATION
2cb90 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   */../*.** Gener
2cba0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
2cbb0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2cbc0 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
2cbd0 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
2cbe0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
2cbf0 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f  re returned acco
2cc00 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c  rding to the Sel
2cc10 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
2cc20 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
2cc30 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ts in sqliteInt.
2cc40 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e  h for further in
2cc50 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
2cc60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2cc70 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
2cc80 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
2cc90 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
2cca0 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
2ccb0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
2ccc0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
2ccd0 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
2cce0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
2ccf0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2cd00 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
2cd10 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
2cd20 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
2cd30 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
2cd40 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
2cd50 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
2cd60 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
2cd70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2cd80 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2cd90 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2cda0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
2cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cdc0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
2cdd0 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
2cde0 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
2cdf0 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
2ce00 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
2ce10 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
2ce20 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
2ce30 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2ce40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2ce50 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
2ce60 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
2ce70 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
2ce80 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2ce90 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
2cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ceb0 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
2cec0 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
2ced0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
2cee0 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
2cef0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2cf00 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
2cf10 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
2cf20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
2cf30 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74  st = 0;  /* List
2cf40 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
2cf50 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
2cf60 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
2cf70 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2cf80 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
2cf90 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
2cfa0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
2cfb0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
2cfc0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
2cfd0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
2cfe0 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
2cff0 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
2d000 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2d010 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
2d020 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
2d030 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
2d040 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
2d050 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LL */.  int rc =
2d060 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
2d070 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
2d080 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
2d090 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e  tion */.  Distin
2d0a0 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b  ctCtx sDistinct;
2d0b0 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
2d0c0 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54  to code the DIST
2d0d0 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  INCT keyword */.
2d0e0 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b    SortCtx sSort;
2d0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
2d100 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
2d110 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2d120 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  use */.  AggInfo
2d130 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
2d140 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
2d150 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
2d160 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
2d170 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
2d180 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2d190 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
2d1a0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
2d1b0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
2d1c0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2d1d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2d1e0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2d1f0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
2d200 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c   int iRestoreSel
2d210 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
2d220 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61  iSelectId;.  pPa
2d230 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d  rse->iSelectId =
2d240 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
2d250 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  lectId++;.#endif
2d260 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
2d270 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
2d280 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2d290 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
2d2a0 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
2d2b0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
2d2c0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
2d2d0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
2d2e0 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
2d2f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
2d300 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
2d310 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
2d320 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  fo));.#if SELECT
2d330 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2d340 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
2d350 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43  ndent++;.  SELEC
2d360 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
2d370 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65  p, ("begin proce
2d380 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69  ssing:\n"));.  i
2d390 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2d3a0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2d3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2d3c0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2d3d0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2d3e0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2d3f0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2d400 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2d410 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
2d420 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2d430 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2d440 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
2d450 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2d460 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2d470 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2d480 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
2d490 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
2d4a0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
2d4b0 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
2d4c0 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
2d4d0 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
2d4e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
2d4f0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d500 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
2d510 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
2d520 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
2d530 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2d540 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
2d550 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d560 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
2d570 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
2d580 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
2d590 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2d5a0 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
2d5b0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2d5c0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2d5d0 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
2d5e0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
2d5f0 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
2d600 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
2d610 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
2d620 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
2d630 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
2d640 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
2d650 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
2d660 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
2d670 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2d680 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
2d690 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
2d6a0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
2d6b0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
2d6c0 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
2d6d0 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
2d6e0 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
2d6f0 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
2d700 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
2d710 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
2d720 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
2d730 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  By;.  pTabList =
2d740 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
2d750 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2d760 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d770 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
2d780 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61  ect_end;.  }.  a
2d790 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
2d7a0 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d  !=0 );.  isAgg =
2d7b0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2d7c0 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
2d7d0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2d7e0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2d7f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2d800 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2d810 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2d820 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  100,pParse,p, ("
2d830 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
2d840 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ution:\n"));.   
2d850 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2d860 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2d870 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2d880 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20  * Get a pointer 
2d890 74 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  the VDBE under c
2d8a0 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c 6c  onstruction, all
2d8b0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 56 44  ocating a new VD
2d8c0 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 64  BE if one.  ** d
2d8d0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
2d8e0 65 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20 73  exist */.  v = s
2d8f0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2d900 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
2d910 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
2d920 65 6e 64 3b 0a 20 20 69 66 28 20 70 44 65 73 74  end;.  if( pDest
2d930 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
2d940 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
2d950 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
2d960 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a  Parse, p);.  }..
2d970 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c 61 74    /* Try to flat
2d980 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
2d990 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2d9a0 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61  e up into the ma
2d9b0 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69  in query.  */.#i
2d9c0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2d9d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
2d9e0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
2d9f0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
2da00 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
2da10 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
2da20 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2da30 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2da40 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2da50 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2da60 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
2da70 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
2da80 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41  ect;.    int isA
2da90 67 67 53 75 62 3b 0a 20 20 20 20 54 61 62 6c 65  ggSub;.    Table
2daa0 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
2dab0 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 53  pTab;.    if( pS
2dac0 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
2dad0 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20  ;..    /* Catch 
2dae0 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20  mismatch in the 
2daf0 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73  declared columns
2db00 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74   of a view and t
2db10 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
2db20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
2db30 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65  he SELECT on the
2db40 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20   RHS */.    if( 
2db50 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62  pTab->nCol!=pSub
2db60 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
2db70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2db80 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2db90 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f   "expected %d co
2dba0 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62  lumns for '%s' b
2dbb0 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20  ut got %d",.    
2dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbd0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54    pTab->nCol, pT
2dbe0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d  ab->zName, pSub-
2dbf0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
2dc00 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
2dc10 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
2dc20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2dc30 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
2dc40 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
2dc50 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 61 6e  OUP BY clause an
2dc60 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77  d if.    ** it w
2dc70 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74  ill be implement
2dc80 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
2dc90 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ne, then do not 
2dca0 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20  flatten.  This. 
2dcb0 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f     ** restrictio
2dcc0 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e  n allows SQL con
2dcd0 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69  structs like thi
2dce0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2dcf0 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69    SELECT expensi
2dd00 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20  ve_function(x). 
2dd10 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53     **    FROM (S
2dd20 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
2dd30 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49   ORDER BY y LIMI
2dd40 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  T 10);.    **.  
2dd50 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69    ** The expensi
2dd60 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  ve_function() is
2dd70 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f   only computed o
2dd80 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74 68  n the 10 rows th
2dd90 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75  at.    ** are ou
2dda0 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68 61  tput, rather tha
2ddb0 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74  n every row of t
2ddc0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
2ddd0 0a 20 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e  .    if( (pSub->
2dde0 70 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20 70  pOrderBy!=0 || p
2ddf0 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 21 3d 30  Sub->pGroupBy!=0
2de00 29 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20  ).     && i==0. 
2de10 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74      && (pTabList
2de20 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20  ->nSrc==1.      
2de30 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
2de40 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
2de50 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
2de60 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20 20 26  OSS))!=0).     &
2de70 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2de80 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2de90 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a  _SubqCoroutine).
2dea0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e      ){.      con
2deb0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
2dec0 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53    isAggSub = (pS
2ded0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
2dee0 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
2def0 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
2df00 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
2df10 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73   p, i, isAgg, is
2df20 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20  AggSub) ){.     
2df30 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72   /* This subquer
2df40 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65  y can be absorbe
2df50 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  d into its paren
2df60 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
2df70 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20  isAggSub ){.    
2df80 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20      isAgg = 1;. 
2df90 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61         p->selFla
2dfa0 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
2dfb0 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
2dfc0 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    i = -1;.    }.
2dfd0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
2dfe0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
2dff0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2e000 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2e010 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  nd;.    if( !Ign
2e020 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2e030 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53  est) ){.      sS
2e040 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
2e050 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
2e060 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
2e070 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e080 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
2e090 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f  T.  /* Handle co
2e0a0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
2e0b0 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74  atements using t
2e0c0 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74  he separate mult
2e0d0 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70  iSelect().  ** p
2e0e0 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20  rocedure..  */. 
2e0f0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
2e100 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
2e110 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2e120 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78  , pDest);.    ex
2e130 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2e140 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2e150 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2e160 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  tId);.#if SELECT
2e170 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2e180 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2e190 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63  pParse,p,("end c
2e1a0 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70  ompound-select p
2e1b0 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
2e1c0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c      pParse->nSel
2e1d0 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e  ectIndent--;.#en
2e1e0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72  dif.    return r
2e1f0 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
2e200 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72   /* For each ter
2e210 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
2e220 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74 68 69  ause, do two thi
2e230 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41 75  ngs:.  ** (1) Au
2e240 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66 65 72  thorized unrefer
2e250 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20 20 2a  enced tables.  *
2e260 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65 20 63  * (2) Generate c
2e270 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
2e280 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20 66  queries.  */.  f
2e290 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2e2a0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2e2b0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2e2c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2e2d0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2e2e0 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
2e2f0 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
2e300 74 20 2a 70 53 75 62 3b 0a 0a 20 20 20 20 2f 2a  t *pSub;..    /*
2e310 20 49 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45   Issue SQLITE_RE
2e320 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  AD authorization
2e330 73 20 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f  s with a fake co
2e340 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e  lumn name for an
2e350 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20  y.    ** tables 
2e360 74 68 61 74 20 61 72 65 20 72 65 66 65 72 65 6e  that are referen
2e370 63 65 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69  ced but from whi
2e380 63 68 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65  ch no values are
2e390 20 65 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20   extracted..    
2e3a0 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  ** Examples of w
2e3b0 68 65 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73  here these kinds
2e3c0 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f   of null SQLITE_
2e3d0 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69  READ authorizati
2e3e0 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ons.    ** would
2e3f0 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20   occur:.    **. 
2e400 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
2e410 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
2e420 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  1;   -- SQLITE_R
2e430 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a  EAD t1."".    **
2e440 20 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a       SELECT t1.*
2e450 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20   FROM t1, t2;   
2e460 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74  -- SQLITE_READ t
2e470 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20  2."".    **.    
2e480 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75  ** The fake colu
2e490 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d  mn name is an em
2e4a0 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20  pty string.  It 
2e4b0 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
2e4c0 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a  a table to.    *
2e4d0 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20  * have a column 
2e4e0 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70  named by the emp
2e4f0 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68  ty string, in wh
2e500 69 63 68 20 63 61 73 65 20 74 68 65 72 65 20 69  ich case there i
2e510 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20  s no way to.    
2e520 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20 62  ** distinguish b
2e530 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65  etween an unrefe
2e540 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64  renced table and
2e550 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72   an actual refer
2e560 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20  ence to the.    
2e570 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68  ** "" column. Th
2e580 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
2e590 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20 66 61  n was for the fa
2e5a0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74  ke column name t
2e5b0 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20  o be a NULL,.   
2e5c0 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
2e5d0 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20  be unambiguous. 
2e5e0 20 42 75 74 20 6c 65 67 61 63 79 20 61 75 74 68   But legacy auth
2e5f0 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
2e600 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a  cks might.    **
2e610 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75   assume the colu
2e620 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e  mn name is non-N
2e630 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74  ULL and segfault
2e640 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e  .  The use of an
2e650 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74   empty.    ** st
2e660 72 69 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b  ring for the fak
2e670 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65  e column name se
2e680 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a  ems safer..    *
2e690 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2e6a0 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20  >colUsed==0 ){. 
2e6b0 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68       sqlite3Auth
2e6c0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
2e6d0 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d  LITE_READ, pItem
2e6e0 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74  ->zName, "", pIt
2e6f0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
2e700 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
2e710 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2e720 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
2e730 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2e740 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47  T_VIEW).    /* G
2e750 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2e760 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
2e770 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2e780 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  use.    */.    p
2e790 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
2e7a0 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53  lect;.    if( pS
2e7b0 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
2e7c0 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69  ;..    /* Someti
2e7d0 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  mes the code for
2e7e0 20 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c   a subquery will
2e7f0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f   be generated mo
2e800 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f  re than.    ** o
2e810 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71  nce, if the subq
2e820 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20  uery is part of 
2e830 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2e840 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   in a LEFT JOIN,
2e850 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d  .    ** for exam
2e860 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ple.  In that ca
2e870 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e  se, do not regen
2e880 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
2e890 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a  o manifest.    *
2e8a0 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20  * a view or the 
2e8b0 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d  co-routine to im
2e8c0 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20  plement a view. 
2e8d0 20 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61   The first insta
2e8e0 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75  nce.    ** is su
2e8f0 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68  fficient, though
2e900 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
2e910 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20  to manifest the 
2e920 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20  view does need. 
2e930 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f     ** to be invo
2e940 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  ked again. */.  
2e950 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64    if( pItem->add
2e960 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20  rFillSub ){.    
2e970 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
2e980 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20  viaCoroutine==0 
2e990 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2e9a0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
2e9b0 74 20 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20  t manifests the 
2e9c0 76 69 65 77 20 6d 69 67 68 74 20 62 65 20 61 20  view might be a 
2e9d0 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65  one-time routine
2e9e0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  ,.        ** or 
2e9f0 69 74 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  it might need to
2ea00 20 62 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63   be rerun on eac
2ea10 68 20 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61  h iteration beca
2ea20 75 73 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a  use it.        *
2ea30 2a 20 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72  * encodes a corr
2ea40 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 2e  elated subquery.
2ea50 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74   */.        test
2ea60 63 61 73 65 28 20 73 71 6c 69 74 65 33 56 64 62  case( sqlite3Vdb
2ea70 65 47 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d  eGetOp(v, pItem-
2ea80 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f  >addrFillSub)->o
2ea90 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29  pcode==OP_Once )
2eaa0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2eab0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2eac0 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e  P_Gosub, pItem->
2ead0 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  regReturn, pItem
2eae0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a  ->addrFillSub);.
2eaf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
2eb00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
2eb10 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
2eb20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79  Parse.nHeight by
2eb30 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74   the height of t
2eb40 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65  he largest expre
2eb50 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65  ssion.    ** tre
2eb60 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  e referred to by
2eb70 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
2eb80 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
2eb90 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
2eba0 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
2ebb0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
2ebc0 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
2ebd0 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
2ebe0 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
2ebf0 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
2ec00 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
2ec10 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
2ec20 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
2ec30 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
2ec40 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
2ec50 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
2ec60 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
2ec70 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
2ec80 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
2ec90 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
2eca0 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  t(p);..    /* Ma
2ecb0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e  ke copies of con
2ecc0 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75  stant WHERE-clau
2ecd0 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  se terms in the 
2ece0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e  outer query down
2ecf0 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74  .    ** inside t
2ed00 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
2ed10 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20  is can help the 
2ed20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20  subquery to run 
2ed30 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
2ed40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2ed50 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pItem->fg.join
2ed60 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
2ed70 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 75 73 68  ==0.     && push
2ed80 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70  DownWhereTerms(p
2ed90 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e  Parse, pSub, p->
2eda0 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69  pWhere, pItem->i
2edb0 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23  Cursor).    ){.#
2edc0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2edd0 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28  NABLED.      if(
2ede0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2edf0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
2ee00 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41         SELECTTRA
2ee10 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
2ee20 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45 2d  p,("After WHERE-
2ee30 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e  clause push-down
2ee40 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  :\n"));.        
2ee50 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2ee60 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2ee70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2ee80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
2ee90 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d  erate code to im
2eea0 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71  plement the subq
2eeb0 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20  uery.    **.    
2eec0 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
2eed0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
2eee0 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  s a co-routine i
2eef0 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
2ef00 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 20  re true:.    ** 
2ef10 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
2ef20 65 72 79 20 69 73 20 67 75 61 72 61 6e 74 65 65  ery is guarantee
2ef30 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65  d to be the oute
2ef40 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20  r loop (so that 
2ef50 69 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  it.    **       
2ef60 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2ef70 6f 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6d 6f  o be computed mo
2ef80 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20  re than once).  
2ef90 20 20 2a 2a 20 20 20 28 32 29 20 20 52 45 4d 4f    **   (2)  REMO
2efa0 56 45 44 20 28 32 30 31 37 2d 30 39 2d 32 38 29  VED (2017-09-28)
2efb0 3a 20 54 68 65 20 41 4c 4c 20 6b 65 79 77 6f 72  : The ALL keywor
2efc0 64 20 61 66 74 65 72 20 53 45 4c 45 43 54 20 69  d after SELECT i
2efd0 73 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 2a  s omitted..    *
2efe0 2a 20 20 20 28 33 29 20 20 43 6f 2d 72 6f 75 74  *   (3)  Co-rout
2eff0 69 6e 65 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ines are not dis
2f000 61 62 6c 65 64 20 75 73 69 6e 67 20 73 71 6c 69  abled using sqli
2f010 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2f020 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ().    **       
2f030 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
2f040 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
2f050 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ONS..    **.    
2f060 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68 65  ** TODO: Are the
2f070 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 73  re other reasons
2f080 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20 75   beside (1) to u
2f090 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a  se a co-routine.
2f0a0 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
2f0b0 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20  ation?.    */.  
2f0c0 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20 20    if( i==0.     
2f0d0 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53  && (pTabList->nS
2f0e0 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20  rc==1.          
2f0f0 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e    || (pTabList->
2f100 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[1].fg.jointype
2f110 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f  &(JT_LEFT|JT_CRO
2f120 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31 29  SS))!=0)  /* (1)
2f130 20 2a 2f 0a 20 20 20 20 20 2f 2a 2a 2a 20 63 6f   */.     /*** co
2f140 6e 73 74 72 61 69 6e 74 20 72 65 6d 6f 76 65 64  nstraint removed
2f150 3a 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  : && (p->selFlag
2f160 73 20 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 20 20  s & SF_All)==0  
2f170 20 20 20 20 20 20 20 20 20 20 20 28 32 29 20 2a             (2) *
2f180 2f 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  /.     && Optimi
2f190 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
2f1a0 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72  , SQLITE_SubqCor
2f1b0 6f 75 74 69 6e 65 29 20 20 20 20 20 20 20 20 20  outine)         
2f1c0 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a        /* (3) */.
2f1d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2f1e0 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72  Implement a co-r
2f1f0 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
2f200 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   return a single
2f210 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
2f220 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  lt.      ** set 
2f230 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69  on each invocati
2f240 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
2f250 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d     int addrTop =
2f260 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2f270 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20  entAddr(v)+1;.  
2f280 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
2f290 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
2f2a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2f2b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f2c0 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
2f2d0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2f2e0 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70  turn, 0, addrTop
2f2f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2f300 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
2f310 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2f320 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  e));.      pItem
2f330 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
2f340 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73  addrTop;.      s
2f350 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
2f360 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
2f370 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
2f380 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2f390 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2f3a0 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2f3b0 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2f3c0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2f3d0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2f3e0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2f3f0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2f400 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2f410 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
2f420 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
2f430 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
2f440 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
2f450 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2f460 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
2f470 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
2f480 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
2f490 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72  tine(v, pItem->r
2f4a0 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2f4b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2f4c0 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d  Here(v, addrTop-
2f4d0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2f4e0 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2f4f0 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
2f500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2f510 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2f520 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2f530 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61  fill an ephemera
2f540 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20  l table with.   
2f550 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
2f560 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65  t of this subque
2f570 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72  ry.  pItem->addr
2f580 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69  FillSub will poi
2f590 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  nt.      ** to t
2f5a0 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2f5b0 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72  e generated subr
2f5c0 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e  outine.  pItem->
2f5d0 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20  regReturn.      
2f5e0 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72  ** is a register
2f5f0 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
2f600 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ld the subroutin
2f610 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
2f620 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f630 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20  int topAddr;.   
2f640 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20     int onceAddr 
2f650 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
2f660 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73 74  etAddr;.      st
2f670 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2f680 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20  m *pPrior;..    
2f690 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
2f6a0 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20  >addrFillSub==0 
2f6b0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2f6c0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
2f6d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2f6e0 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69    topAddr = sqli
2f6f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f700 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2f710 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2f720 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2f730 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f  addrFillSub = to
2f740 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69  pAddr+1;.      i
2f750 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43  f( pItem->fg.isC
2f760 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a  orrelated==0 ){.
2f770 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2f780 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
2f790 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64  t correlated and
2f7a0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69   if we are not i
2f7b0 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20  nside of.       
2f7c0 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74   ** a trigger, t
2f7d0 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  hen we only need
2f7e0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
2f7f0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62  value of the sub
2f800 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  query.        **
2f810 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20   once. */.      
2f820 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c    onceAddr = sql
2f830 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
2f840 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
2f850 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2f860 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2f870 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
2f880 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
2f890 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2f8a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f8b0 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
2f8c0 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
2f8d0 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
2f8e0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2f8f0 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  me));.      }.  
2f900 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73 53      pPrior = isS
2f910 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61 62  elfJoinView(pTab
2f920 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20  List, pItem);.  
2f930 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
2f940 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2f950 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f960 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65 6d  P_OpenDup, pItem
2f970 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69 6f  ->iCursor, pPrio
2f980 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  r->iCursor);.   
2f990 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2f9a0 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2f9b0 65 6c 65 63 74 49 64 2c 20 70 50 72 69 6f 72 2d  electId, pPrior-
2f9c0 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
2f9d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
2f9e0 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  ior->pSelect!=0 
2f9f0 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  );.        pSub-
2fa00 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
2fa10 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e  rior->pSelect->n
2fa20 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
2fa30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fa40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
2fa50 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
2fa60 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
2fa70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2fa80 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2fa90 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2faa0 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2fab0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2fac0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2fad0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
2fae0 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
2faf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
2fb00 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
2fb10 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
2fb20 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
2fb30 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73  if( onceAddr ) s
2fb40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2fb50 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b  re(v, onceAddr);
2fb60 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d  .      retAddr =
2fb70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fb80 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2fb90 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2fba0 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
2fbb0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25  mment((v, "end %
2fbc0 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
2fbd0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2fbe0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2fbf0 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20  eP1(v, topAddr, 
2fc00 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  retAddr);.      
2fc10 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2fc20 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
2fc30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2fc40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2fc50 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2fc60 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  nd;.    pParse->
2fc70 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
2fc80 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
2fc90 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ht(p);.#endif.  
2fca0 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  }..  /* Various 
2fcb0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
2fcc0 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e  SELECT copied in
2fcd0 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  to local variabl
2fce0 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76  es for.  ** conv
2fcf0 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c  enience */.  pEL
2fd00 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
2fd10 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
2fd20 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
2fd30 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
2fd40 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
2fd50 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
2fd60 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
2fd70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2fd80 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
2fd90 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2fda0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2fdb0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2fdc0 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
2fdd0 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
2fde0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
2fdf0 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
2fe00 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
2fe10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2fe20 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2fe30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2fe40 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2fe50 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49  COUNTOFVIEW_OPTI
2fe60 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f  MIZATION.  if( O
2fe70 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2fe80 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
2fe90 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c  eryFlattener|SQL
2fea0 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29  ITE_CountOfView)
2feb0 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56 69  .   && countOfVi
2fec0 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70  ewOptimization(p
2fed0 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20  Parse, p).  ){. 
2fee0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2fef0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
2ff00 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70  elect_end;.    p
2ff10 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
2ff20 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  t;.    pTabList 
2ff30 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23  = p->pSrc;.  }.#
2ff40 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
2ff50 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54  he query is DIST
2ff60 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  INCT with an ORD
2ff70 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74  ER BY but is not
2ff80 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61   an aggregate, a
2ff90 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  nd .  ** if the 
2ffa0 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74  select-list is t
2ffb0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
2ffc0 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68  RDER BY list, th
2ffd0 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  en this query.  
2ffe0 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
2fff0 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42  ten as a GROUP B
30000 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  Y. In other word
30010 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  s, this:.  **.  
30020 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
30030 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20  STINCT xyz FROM 
30040 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a  ... ORDER BY xyz
30050 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72  .  **.  ** is tr
30060 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20  ansformed to:.  
30070 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
30080 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
30090 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44  GROUP BY xyz ORD
300a0 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
300b0 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
300c0 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
300d0 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
300e0 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
300f0 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
30100 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
30110 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
30120 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
30130 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
30140 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
30150 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
30160 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
30170 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
30180 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
30190 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
301a0 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
301b0 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
301c0 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
301d0 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
301e0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
301f0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
30200 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
30210 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
30220 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
30230 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
30240 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c  OrderBy, pEList,
30250 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20   -1)==0.  ){.   
30260 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
30270 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
30280 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
30290 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
302a0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
302b0 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
302c0 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
302d0 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
302e0 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
302f0 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
30300 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
30310 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
30320 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
30330 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
30340 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
30350 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
30360 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
30370 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
30380 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
30390 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
303a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
303b0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
303c0 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
303d0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
303e0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
303f0 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
30400 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
30410 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
30420 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53  ,("Transform DIS
30430 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50  TINCT into GROUP
30440 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20   BY:\n"));.     
30450 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
30460 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
30470 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
30480 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
30490 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
304a0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65  clause, then cre
304b0 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
304c0 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64   index to.  ** d
304d0 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20  o the sorting.  
304e0 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67  But this sorting
304f0 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
30500 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20   might end up.  
30510 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  ** being unused 
30520 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
30530 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  be extracted in 
30540 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
30550 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69  ..  ** If that i
30560 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
30570 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
30580 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
30590 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63  n will be.  ** c
305a0 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
305b0 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67  Noop once we fig
305c0 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
305d0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
305e0 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65  s.  ** not neede
305f0 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64  d.  The sSort.ad
30600 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69  drSortIndex vari
30610 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
30620 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20  facilitate.  ** 
30630 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
30640 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
30650 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
30660 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
30670 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
30680 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
30690 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72  ist(pParse, sSor
306a0 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70  t.pOrderBy, 0, p
306b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
306c0 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
306d0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
306e0 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  ++;.    sSort.ad
306f0 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
30700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30710 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
30720 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
30730 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72       sSort.iECur
30740 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sor, sSort.pOrde
30750 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c  rBy->nExpr+1+pEL
30760 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20  ist->nExpr, 0,. 
30770 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
30780 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
30790 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20  INFO.      );.  
307a0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
307b0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
307c0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
307d0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
307e0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
307f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
30800 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
30810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
30820 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
30830 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
30840 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30850 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
30860 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
30870 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
30880 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
30890 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
308a0 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
308b0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
308c0 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70 2d  el(v);.  if( (p-
308d0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
308e0 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b  ixedLimit)==0 ){
308f0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
30900 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
30910 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
30920 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d    }.  computeLim
30930 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
30940 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20  se, p, iEnd);.  
30950 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  if( p->iLimit==0
30960 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f   && sSort.addrSo
30970 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
30980 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
30990 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f  ngeOpcode(v, sSo
309a0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
309b0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29  , OP_SorterOpen)
309c0 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
309d0 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
309e0 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
309f0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65  ..  /* Open an e
30a00 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
30a10 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
30a20 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
30a30 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
30a40 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
30a50 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63   ){.    sDistinc
30a60 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72  t.tabTnct = pPar
30a70 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
30a80 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e  sDistinct.addrTn
30a90 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ct = sqlite3Vdbe
30aa0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
30ab0 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
30ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ad0 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
30ae0 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
30af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
30b10 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f  char*)keyInfoFro
30b20 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
30b30 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29  , p->pEList,0,0)
30b40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
30b60 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
30b70 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
30b80 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
30b90 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69  RDERED);.    sDi
30ba0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
30bb0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
30bc0 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d  T_UNORDERED;.  }
30bd0 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69  else{.    sDisti
30be0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
30bf0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
30c00 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
30c10 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
30c20 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
30c30 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  No aggregate fun
30c40 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52  ctions and no GR
30c50 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
30c60 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c  .    u16 wctrlFl
30c70 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74  ags = (sDistinct
30c80 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f  .isTnct ? WHERE_
30c90 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20  WANT_DISTINCT : 
30ca0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
30cb0 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d  WHERE_USE_LIMIT=
30cc0 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29  =SF_FixedLimit )
30cd0 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73  ;.    wctrlFlags
30ce0 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20   |= p->selFlags 
30cf0 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b  & SF_FixedLimit;
30d00 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
30d10 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
30d20 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20  . */.    pWInfo 
30d30 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
30d40 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
30d50 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
30d60 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
30d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
30d90 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
30da0 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  gs, p->nSelectRo
30db0 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  w);.    if( pWIn
30dc0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
30dd0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
30de0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
30df0 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
30e00 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
30e10 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
30e20 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
30e30 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
30e40 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
30e50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
30e60 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
30e70 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
30e80 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
30e90 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
30ea0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
30eb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
30ec0 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
30ed0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
30ee0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
30ef0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
30f00 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
30f10 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
30f20 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  fo);.      sSort
30f30 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  .bOrderedInnerLo
30f40 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  op = sqlite3Wher
30f50 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  eOrderedInnerLoo
30f60 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  p(pWInfo);.     
30f70 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
30f80 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
30f90 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
30fa0 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
30fb0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
30fc0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
30fd0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
30fe0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
30ff0 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
31000 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
31010 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
31020 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
31030 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
31040 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
31050 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
31060 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
31070 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
31080 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
31090 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
310a0 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
310b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
310c0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
310d0 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
310e0 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
310f0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
31100 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
31110 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  op. */.    asser
31120 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45  t( p->pEList==pE
31130 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c 65  List );.    sele
31140 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
31150 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72  se, p, -1, &sSor
31160 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
31170 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
31180 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31190 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
311a0 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
311b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
311d0 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
311e0 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
311f0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
31200 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
31210 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
31220 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
31230 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
31240 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
31250 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
31260 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
31270 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
31280 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
31290 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
312a0 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
312b0 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
312c0 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
312d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
312e0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
312f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
31300 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
31310 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
31320 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
31330 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
31340 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
31350 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
31360 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
31370 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
31380 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
31390 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
313a0 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
313b0 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
313c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313d0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
313e0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
313f0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
31400 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
31410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31420 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
31430 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
31440 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
31450 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
31460 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
31470 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
31480 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
31490 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
314a0 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
314b0 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
314c0 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
314d0 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
314e0 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
314f0 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
31500 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
31510 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
31520 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
31530 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
31540 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
31550 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
31560 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
31570 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
31580 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
31590 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
315a0 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
315b0 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
315c0 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
315d0 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
315e0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
315f0 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
31600 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
31610 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
31620 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
31630 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
31640 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
31650 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
31660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31670 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
31680 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
31690 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
316a0 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
316b0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
316c0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
316d0 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
316e0 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
316f0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
31700 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
31710 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
31720 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
31730 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
31740 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
31750 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
31760 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
31770 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
31780 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
31790 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
317a0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
317b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36  .      assert( 6
317c0 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
317d0 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69  (100) );.      i
317e0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
317f0 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  >66 ) p->nSelect
31800 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65  Row = 66;.    }e
31810 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
31820 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
31830 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20  Est(1) );.      
31840 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
31850 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
31860 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
31870 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
31880 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
31890 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
318a0 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
318b0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
318c0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
318d0 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
318e0 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
318f0 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
31900 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
31910 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
31920 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
31930 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
31940 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
31950 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
31960 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
31970 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20  might use a.    
31980 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ** database inde
31990 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f  x that causes ro
319a0 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64  ws to be grouped
319b0 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71   together as req
319c0 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74  uired.    ** but
319d0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f   not actually so
319e0 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  rted. Either way
319f0 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  , record the fac
31a00 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  t that the.    *
31a10 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47  * ORDER BY and G
31a20 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20  ROUP BY clauses 
31a30 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20  are the same by 
31a40 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65  setting the orde
31a50 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61  rByGrp.    ** va
31a60 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
31a70 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
31a80 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75  istCompare(pGrou
31a90 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  pBy, sSort.pOrde
31aa0 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
31ab0 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20       orderByGrp 
31ac0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  = 1;.    }. .   
31ad0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
31ae0 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
31af0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
31b00 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
31b10 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
31b20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
31b30 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
31b40 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
31b50 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
31b60 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
31b70 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
31b80 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
31b90 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
31ba0 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
31bb0 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
31bc0 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
31bd0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
31be0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
31bf0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
31c00 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
31c10 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
31c20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
31c30 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
31c40 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
31c50 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
31c60 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
31c70 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
31c80 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
31c90 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
31ca0 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
31cb0 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
31cc0 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
31cd0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
31ce0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
31cf0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
31d00 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
31d10 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
31d20 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
31d30 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a  Sort.pOrderBy);.
31d40 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
31d50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  ){.      if( pGr
31d60 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
31d70 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d   assert( pWhere=
31d80 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20  =p->pWhere );.  
31d90 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68        havingToWh
31da0 65 72 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ere(pParse, pGro
31db0 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 26  upBy, pHaving, &
31dc0 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
31dd0 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
31de0 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a  pWhere;.      }.
31df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
31e00 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
31e10 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
31e20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
31e30 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
31e40 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
31e50 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
31e60 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
31e70 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
31e80 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
31e90 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
31ea0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
31eb0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
31ec0 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
31ed0 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
31ee0 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
31ef0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
31f00 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
31f10 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
31f20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
31f30 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
31f40 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
31f50 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
31f60 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
31f70 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
31f80 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
31f90 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
31fa0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
31fb0 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
31fc0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
31fd0 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
31fe0 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
31ff0 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
32000 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
32010 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
32020 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
32030 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
32040 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
32050 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
32060 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
32070 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
32080 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
32090 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
320a0 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r1;          /* 
320b0 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
320c0 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
320d0 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
320e0 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
320f0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
32100 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
32110 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
32120 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
32130 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
32140 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
32150 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
32160 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
32170 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
32180 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
32190 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
321a0 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
321b0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
321c0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
321d0 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
321e0 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
321f0 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
32200 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
32210 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
32220 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
32230 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
32240 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
32250 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
32260 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
32270 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
32280 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
32290 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
322a0 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
322b0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
322c0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
322d0 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
322e0 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
322f0 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
32300 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
32310 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
32320 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
32330 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
32340 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
32350 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
32360 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
32370 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50  fter all, the OP
32380 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74  _SorterOpen inst
32390 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
323a0 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
323b0 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
323c0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
323d0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
323e0 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
323f0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
32400 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
32410 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
32420 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  se, pGroupBy, 0,
32430 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
32440 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  n);.      addrSo
32450 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
32460 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
32470 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a  OP_SorterOpen, .
32480 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
32490 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
324a0 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
324b0 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
324c0 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
324d0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
324e0 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e  O);..      /* In
324f0 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
32500 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62  locations used b
32510 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65  y GROUP BY aggre
32520 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  gate processing.
32530 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
32540 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  UseFlag = ++pPar
32550 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
32560 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70  iAbortFlag = ++p
32570 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
32580 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20     regOutputRow 
32590 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
325a0 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
325b0 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
325c0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
325d0 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20  .      regReset 
325e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
325f0 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65  ;.      addrRese
32600 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
32610 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
32620 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73     iAMem = pPars
32630 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
32640 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
32650 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
32660 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
32670 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
32680 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
32690 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
326a0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
326b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
326c0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
326d0 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 0, iAbortFlag)
326e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
326f0 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61  ent((v, "clear a
32700 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
32710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32720 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
32730 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67  ger, 0, iUseFlag
32740 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
32750 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
32760 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
32770 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73  mpty"));.      s
32780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
32790 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
327a0 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72  iAMem, iAMem+pGr
327b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
327c0 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
327d0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
327e0 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
327f0 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
32800 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
32810 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
32820 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
32830 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
32840 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
32850 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
32860 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
32870 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
32880 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
32890 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
328a0 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
328b0 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
328c0 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
328d0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
328e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
328f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
32900 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
32910 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
32920 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
32930 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
32940 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
32950 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20  , pGroupBy, 0,. 
32960 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47           WHERE_G
32970 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42  ROUPBY | (orderB
32980 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52  yGrp ? WHERE_SOR
32990 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30  TBYGROUP : 0), 0
329a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
329b0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
329c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
329d0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
329e0 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
329f0 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70  (pWInfo)==pGroup
32a00 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
32a10 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
32a20 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
32a30 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
32a40 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
32a50 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
32a60 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
32a70 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
32a80 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
32a90 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
32aa0 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
32ab0 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
32ac0 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
32ad0 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
32ae0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32af0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
32b00 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
32b10 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
32b20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
32b30 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
32b40 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
32b50 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
32b60 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
32b70 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
32b80 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
32b90 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
32ba0 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
32bb0 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
32bc0 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
32bd0 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
32be0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
32bf0 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
32c00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32c10 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20  int regBase;.   
32c20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f       int regReco
32c30 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rd;.        int 
32c40 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  nCol;.        in
32c50 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20  t nGroupBy;..   
32c60 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70       explainTemp
32c70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20  Table(pParse, . 
32c80 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73             (sDis
32c90 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
32ca0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  (p->selFlags&SF_
32cb0 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a  Distinct)==0) ?.
32cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cd0 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a      "DISTINCT" :
32ce0 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20   "GROUP BY");.. 
32cf0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
32d00 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
32d10 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
32d20 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
32d30 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
32d40 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  pBy;.        j =
32d50 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
32d60 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
32d70 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
32d80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
32d90 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
32da0 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
32db0 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
32dc0 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
32dd0 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
32de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32df0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
32e00 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
32e10 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
32e20 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
32e30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
32e40 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
32e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
32e60 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
32e70 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
32e80 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29  , regBase, 0, 0)
32e90 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
32ea0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
32eb0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
32ec0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
32ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
32ee0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
32ef0 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
32f00 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
32f10 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
32f20 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
32f30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
32f40 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
32f50 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
32f60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
32f70 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70  GetColumnToReg(p
32f80 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
32f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fa0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
32fb0 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
32fc0 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
32fd0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
32fe0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
32ff0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
33000 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
33010 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
33020 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
33030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33040 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
33050 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
33060 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29  nCol, regRecord)
33070 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
33080 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
33090 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
330a0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
330b0 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
330c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
330d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
330e0 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
330f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
33100 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
33110 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ge(pParse, regBa
33120 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
33130 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
33140 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
33150 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
33160 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f  tingIdxPTab = so
33170 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d  rtPTab = pParse-
33180 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
33190 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74   sortOut = sqlit
331a0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
331b0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
331c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
331d0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
331e0 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74  , sortPTab, sort
331f0 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  Out, nCol);.    
33200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33210 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
33220 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  erSort, sAggInfo
33230 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
33240 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
33250 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
33260 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
33270 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
33280 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
33290 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
332a0 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  x = 1;.        s
332b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
332c0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20  lear(pParse);.. 
332d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
332e0 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72   If the index or
332f0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
33300 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f   used by the GRO
33310 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20  UP BY sort.     
33320 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c   ** will natural
33330 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  ly deliver rows 
33340 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71  in the order req
33350 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44  uired by the ORD
33360 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63  ER BY.      ** c
33370 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68  lause, cancel th
33380 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
33390 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72  e open coded ear
333a0 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lier..      **. 
333b0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
333c0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
333d0 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  - the correct an
333e0 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75  swer should resu
333f0 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  lt regardless.. 
33400 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20       ** Use the 
33410 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
33420 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
33430 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
33440 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20  TIMIZER to .    
33450 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69    ** disable thi
33460 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
33470 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
33480 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ses.  */.      i
33490 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26  f( orderByGrp &&
334a0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
334b0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
334c0 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20  GroupByOrder) . 
334d0 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42        && (groupB
334e0 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33  ySort || sqlite3
334f0 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57  WhereIsSorted(pW
33500 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a  Info)).      ){.
33510 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f          sSort.pO
33520 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
33530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
33540 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
33550 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
33560 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
33570 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
33580 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
33590 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
335a0 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
335b0 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
335c0 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
335d0 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
335e0 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
335f0 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
33600 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
33610 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
33620 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
33630 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
33640 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
33650 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
33660 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
33670 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
33680 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
33690 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
336a0 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
336b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
336c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
336d0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
336e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
336f0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
33700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33710 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
33720 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67  _SorterData, sAg
33730 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
33740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33750 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 72 74              sort
33760 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a  Out, sortPTab);.
33770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
33780 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
33790 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
337a0 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
337b0 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
337c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
337d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
337e0 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a  umn, sortPTab, j
337f0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
33800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33810 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
33820 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
33830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
33840 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
33850 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
33860 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
33870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33880 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
33890 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
338a0 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
338b0 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
338c0 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
338d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338e0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
338f0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
33900 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
33910 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
33920 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
33930 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
33940 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33950 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
33960 61 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72  addr1+1, 0, addr
33970 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
33980 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge(v);..      /*
33990 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
339a0 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
339b0 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
339c0 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
339d0 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   Changes in the 
339e0 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
339f0 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
33a00 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
33a10 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
33a20 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
33a30 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
33a40 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
33a50 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
33a60 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
33a70 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
33a80 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
33a90 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
33aa0 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
33ab0 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
33ac0 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
33ad0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
33ae0 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
33af0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
33b00 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
33b10 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
33b20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
33b30 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
33b40 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
33b50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
33b60 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  deMove(pParse, i
33b70 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72  BMem, iAMem, pGr
33b80 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  oupBy->nExpr);. 
33b90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33ba0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
33bb0 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
33bc0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
33bd0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
33be0 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
33bf0 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
33c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33c10 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
33c20 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
33c30 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  rEnd); VdbeCover
33c40 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
33c50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
33c60 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
33c70 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
33c80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
33c90 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
33ca0 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
33cb0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
33cc0 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75  ((v, "reset accu
33cd0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
33ce0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
33cf0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
33d00 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
33d10 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
33d20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
33d30 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
33d40 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
33d50 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
33d60 64 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64  ddr1);.      upd
33d70 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
33d80 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
33d90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33da0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
33db0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
33dc0 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
33dd0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
33de0 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
33df0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
33e00 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
33e10 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
33e20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
33e30 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
33e40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33e50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
33e60 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
33e70 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
33e80 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
33e90 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
33ea0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
33eb0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
33ec0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
33ed0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
33ee0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
33ef0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
33f00 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
33f10 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
33f20 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
33f30 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
33f40 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
33f50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
33f60 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
33f70 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
33f80 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
33f90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
33fa0 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
33fb0 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
33fc0 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74  over the subrout
33fd0 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ines.      */.  
33fe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
33ff0 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  oto(v, addrEnd);
34000 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
34010 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
34020 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
34030 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
34040 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
34050 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
34060 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
34070 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
34080 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
34090 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
340a0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
340b0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
340c0 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
340d0 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
340e0 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
340f0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
34100 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
34110 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
34120 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
34130 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
34140 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
34150 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
34160 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
34170 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
34180 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
34190 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
341a0 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
341b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
341c0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
341d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
341e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
341f0 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  er, 1, iAbortFla
34200 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
34210 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61  mment((v, "set a
34220 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
34230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34240 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
34250 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
34260 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34270 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
34280 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  (v, addrOutputRo
34290 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  w);.      addrOu
342a0 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
342b0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
342c0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
342d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
342e0 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c  OP_IfPos, iUseFl
342f0 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ag, addrOutputRo
34300 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+2);.      Vdbe
34310 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
34320 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
34330 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
34340 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
34350 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
34360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34370 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
34380 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
34390 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
343a0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
343b0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
343c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
343d0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
343e0 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
343f0 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
34400 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
34410 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
34420 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
34430 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20   -1, &sSort,.   
34440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34450 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70     &sDistinct, p
34460 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
34470 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
34480 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
34490 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
344a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
344b0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
344c0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
344d0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
344e0 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
344f0 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
34500 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
34510 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
34520 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
34530 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
34540 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
34550 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
34560 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
34570 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
34580 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
34590 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
345a0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
345b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
345c0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
345d0 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
345e0 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
345f0 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
34600 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67  y.  Begin aggreg
34610 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68  ate queries with
34620 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f  out GROUP BY: */
34630 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
34640 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
34650 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
34660 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
34670 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65  OUNT.      Table
34680 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66   *pTab;.      if
34690 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70  ( (pTab = isSimp
346a0 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67  leCount(p, &sAgg
346b0 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  Info))!=0 ){.   
346c0 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d       /* If isSim
346d0 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72  pleCount() retur
346e0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
346f0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
34700 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  e, then.        
34710 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
34720 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
34730 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  orm:.        **.
34740 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
34750 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
34760 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20  M <tbl>.        
34770 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
34780 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ere the Table st
34790 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
347a0 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c   represents tabl
347b0 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20  e <tbl>..       
347c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
347d0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
347e0 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20   so common that 
347f0 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  it is optimized 
34800 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20  specially. The. 
34810 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75         ** OP_Cou
34820 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
34830 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65  s executed eithe
34840 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20  r on the intkey 
34850 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20  table that.     
34860 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
34870 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  he data for tabl
34880 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e  e <tbl> or on on
34890 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73  e of its indexes
348a0 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  . It.        ** 
348b0 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65  is better to exe
348c0 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61  cute the op on a
348d0 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65  n index, as inde
348e0 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20  xes are almost. 
348f0 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
34900 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c   spread across l
34910 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74  ess pages than t
34920 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
34930 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ng tables..     
34940 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
34950 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71  nst int iDb = sq
34960 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
34970 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
34980 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
34990 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
349a0 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e   iCsr = pParse->
349b0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43  nTab++;     /* C
349c0 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d  ursor to scan b-
349d0 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tree */.        
349e0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
349f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a00 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
34a10 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
34a20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
34a30 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
34a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
34a50 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64  info for scanned
34a60 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
34a70 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
34a80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
34a90 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69         /* Best i
34aa0 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61  ndex found so fa
34ab0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
34ac0 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74   iRoot = pTab->t
34ad0 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
34ae0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
34af0 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65  f scanned b-tree
34b00 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c   */..        sql
34b10 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
34b20 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
34b30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34b40 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
34b50 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
34b60 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
34b70 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ame);..        /
34b80 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
34b90 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20   index that has 
34ba0 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20  the lowest scan 
34bb0 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  cost..        **
34bc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
34bd0 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20  1-04-15) Do not 
34be0 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f  do a full scan o
34bf0 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69  f an unordered i
34c00 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
34c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
34c20 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20  3-10-03) Do not 
34c30 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65  count the entrie
34c40 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69  s in a partial i
34c50 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
34c60 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70  .        ** In p
34c70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49  ractice the KeyI
34c80 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69  nfo structure wi
34c90 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
34ca0 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20  It is only .    
34cb0 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f      ** passed to
34cc0 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61   keep OP_OpenRea
34cd0 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20  d happy..       
34ce0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
34cf0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
34d00 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65  ) pBest = sqlite
34d10 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
34d20 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
34d30 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
34d40 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
34d50 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
34d60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
34d70 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  dx->bUnordered==
34d80 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
34d90 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
34da0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20  Tab->szTabRow.  
34db0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
34dc0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
34dd0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
34de0 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78   (!pBest || pIdx
34df0 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74  ->szIdxRow<pBest
34e00 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20  ->szIdxRow).    
34e10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
34e20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
34e30 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
34e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34e50 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20   if( pBest ){.  
34e60 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
34e70 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
34e80 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
34e90 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
34ea0 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
34eb0 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pBest);.        
34ec0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  }..        /* Op
34ed0 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
34ee0 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74  ursor, execute t
34ef0 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f  he OP_Count, clo
34f00 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a  se the cursor. *
34f10 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
34f20 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
34f30 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
34f40 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c  Csr, iRoot, iDb,
34f50 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
34f60 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
34f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34f80 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
34f90 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
34fa0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
34fb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34fc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34fd0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
34fe0 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
34ff0 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
35000 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35010 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
35020 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
35030 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69         explainSi
35040 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65  mpleCount(pParse
35050 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a  , pTab, pBest);.
35060 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
35070 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
35080 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
35090 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
350a0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
350b0 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
350c0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
350d0 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20   forms:.        
350e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
350f0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
35100 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
35110 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
35120 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
35130 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
35140 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
35150 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
35160 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
35170 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
35180 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ts.        ** as
35190 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
351a0 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
351b0 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
351c0 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
351d0 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e      ** If where.
351e0 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f  c is able to pro
351f0 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72  duce results sor
35200 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  ted in this orde
35210 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  r, then.        
35220 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
35230 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
35240 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
35250 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
35260 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
35270 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
35280 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
35290 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
352a0 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  p is .        **
352b0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
352c0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
352d0 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
352e0 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
352f0 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
35300 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
35310 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
35320 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
35330 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
35340 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
35350 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
35360 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
35370 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  htly.        ** 
35380 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20  modify behavior 
35390 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
353a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
353b0 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
353c0 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
353d0 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
353e0 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
353f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
35400 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
35410 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
35420 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
35430 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
35440 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
35450 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
35460 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
35470 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
35480 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
35490 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
354a0 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
354b0 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
354c0 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
354d0 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
354e0 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
354f0 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
35500 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
35510 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
35520 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
35530 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
35540 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
35550 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
35560 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
35570 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
35580 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
35590 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
355a0 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
355b0 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
355c0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
355d0 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a  ORMAL;.        .
355e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
355f0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
35600 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
35610 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  ( flag==0 );.   
35620 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76       if( p->pHav
35630 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ing==0 ){.      
35640 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61      flag = minMa
35650 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f  xQuery(&sAggInfo
35660 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20  , &pMinMax);.   
35670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
35680 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c  ssert( flag==0 |
35690 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26  | (pMinMax!=0 &&
356a0 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
356b0 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  =1) );..        
356c0 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
356d0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
356e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
356f0 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20  up(db, pMinMax, 
35700 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  0);.          pD
35710 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20  el = pMinMax;.  
35720 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35730 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
35740 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d 30 20 29   || pMinMax!=0 )
35750 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
35760 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
35770 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
35780 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
35790 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
357a0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
357b0 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
357c0 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
357d0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
357e0 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
357f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
35800 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68    .        /* Th
35810 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
35820 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
35830 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
35840 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
35850 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
35860 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
35870 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
35880 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
35890 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  w.        ** of 
358a0 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20  output..        
358b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74  */.        reset
358c0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
358d0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
358e0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
358f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
35900 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
35910 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
35920 6e 4d 61 78 2c 20 30 2c 66 6c 61 67 2c 30 29 3b  nMax, 0,flag,0);
35930 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
35940 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
35950 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
35960 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
35970 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  el);.          g
35980 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
35990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
359a0 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
359b0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
359c0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
359d0 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d  assert( pMinMax=
359e0 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 || pMinMax->n
359f0 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
35a00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
35a10 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
35a20 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  nfo)>0 ){.      
35a30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
35a40 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57 68  oto(v, sqlite3Wh
35a50 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
35a60 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Info));.        
35a70 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
35a80 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
35a90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
35aa0 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f     (flag==WHERE_
35ab0 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
35ac0 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
35ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
35ae0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
35af0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
35b00 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
35b10 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
35b20 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  gInfo);.      }.
35b30 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
35b40 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
35b50 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
35b60 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
35b70 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51  ing, addrEnd, SQ
35b80 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
35b90 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
35ba0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
35bb0 70 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20  p, -1, 0, 0, .  
35bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bd0 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
35be0 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
35bf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
35c00 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
35c10 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
35c20 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
35c30 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
35c40 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
35c50 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
35c60 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
35c70 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
35c80 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
35c90 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
35ca0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
35cb0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
35cc0 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
35cd0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
35ce0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
35cf0 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
35d00 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
35d10 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
35d20 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
35d30 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
35d40 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
35d50 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
35d60 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
35d70 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20  pTable(pParse,. 
35d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d90 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
35da0 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54  >0 ? "RIGHT PART
35db0 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f   OF ORDER BY":"O
35dc0 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67  RDER BY");.    g
35dd0 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
35de0 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72  pParse, p, &sSor
35df0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
35e00 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
35e10 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
35e20 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
35e30 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
35e40 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
35e50 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
35e60 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  The SELECT has b
35e70 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68  een coded. If th
35e80 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ere is an error 
35e90 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
35ea0 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74  ucture,.  ** set
35eb0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
35ec0 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65   to 1. Otherwise
35ed0 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70   0. */.  rc = (p
35ee0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a  Parse->nErr>0);.
35ef0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
35f00 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
35f10 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
35f20 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
35f30 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
35f40 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
35f50 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
35f60 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
35f70 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
35f80 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
35f90 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
35fa0 63 74 49 64 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ctId);..  sqlite
35fb0 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
35fc0 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
35fd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
35fe0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
35ff0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
36000 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43  _ENABLED.  SELEC
36010 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
36020 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73 69  p,("end processi
36030 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72 73  ng\n"));.  pPars
36040 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74  e->nSelectIndent
36050 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  --;.#endif.  ret
36060 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.