/ Hex Artifact Content
Login

Artifact f3c6e9065fb34f6a23af27ec7f1f717ffbfc2ee4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  ee(db, p);.    p
0b50: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0b60: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0b70: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0b80: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0b90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ba0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
0bb0: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
0bc0: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
0bd0: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
0be0: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
0bf0: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
0c00: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
0c10: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
0c20: 3e 61 66 66 53 64 73 74 20 3d 20 30 3b 0a 20 20  >affSdst = 0;.  
0c30: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 30  pDest->iSdst = 0
0c40: 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  ;.  pDest->nSdst
0c50: 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
0c60: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53  Allocate a new S
0c70: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0c80: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
0c90: 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20  nter to that.** 
0ca0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65  structure..*/.Se
0cb0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
0cc0: 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65 20  ectNew(.  Parse 
0cd0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0ce0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0cf0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
0d00: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a   *pEList,     /*
0d10: 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74   which columns t
0d20: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
0d30: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72 63   result */.  Src
0d40: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
0d50: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
0d60: 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74  lause -- which t
0d70: 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f  ables to scan */
0d80: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
0d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
0da0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
0db0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
0dc0: 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47  upBy,   /* the G
0dd0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
0de0: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
0df0: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  g,        /* the
0e00: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a   HAVING clause *
0e10: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
0e20: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65  rderBy,   /* the
0e30: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
0e40: 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c 61   */.  u32 selFla
0e50: 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs,         /* F
0e60: 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c 20  lag parameters, 
0e70: 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74 69  such as SF_Disti
0e80: 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  nct */.  Expr *p
0e90: 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f  Limit,         /
0ea0: 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20  * LIMIT value.  
0eb0: 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75  NULL means not u
0ec0: 73 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  sed */.  Expr *p
0ed0: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 2f  Offset         /
0ee0: 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20  * OFFSET value. 
0ef0: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f   NULL means no o
0f00: 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65  ffset */.){.  Se
0f10: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65  lect *pNew;.  Se
0f20: 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20  lect standin;.  
0f30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0f40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
0f50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
0f60: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
0f70: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
0f80: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
0f90: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
0fa0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
0fb0: 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64 69    pNew = &standi
0fc0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c  n;.  }.  if( pEL
0fd0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45  ist==0 ){.    pE
0fe0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
0ff0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1000: 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
1010: 78 70 72 28 64 62 2c 54 4b 5f 41 53 54 45 52 49  xpr(db,TK_ASTERI
1020: 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e  SK,0));.  }.  pN
1030: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
1040: 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  ist;.  pNew->op 
1050: 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
1060: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
1070: 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  selFlags;.  pNew
1080: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
1090: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
10a0: 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  0;.#if SELECTTRA
10b0: 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e 65  CE_ENABLED.  pNe
10c0: 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d  w->zSelName[0] =
10d0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65   0;.#endif.  pNe
10e0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
10f0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
1100: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
1110: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e   = -1;.  pNew->n
1120: 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20  SelectRow = 0;. 
1130: 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70   if( pSrc==0 ) p
1140: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Src = sqlite3DbM
1150: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1160: 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20  zeof(*pSrc));.  
1170: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
1180: 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  c;.  pNew->pWher
1190: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e  e = pWhere;.  pN
11a0: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
11b0: 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d  GroupBy;.  pNew-
11c0: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
11d0: 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ng;.  pNew->pOrd
11e0: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
11f0: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
1200: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = 0;.  pNew->pNe
1210: 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  xt = 0;.  pNew->
1220: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
1230: 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
1240: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 70 4e   = pOffset;.  pN
1250: 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20  ew->pWith = 0;. 
1260: 20 61 73 73 65 72 74 28 20 70 4f 66 66 73 65 74   assert( pOffset
1270: 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30  ==0 || pLimit!=0
1280: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1290: 3e 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  >0 || db->malloc
12a0: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
12b0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
12c0: 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61  led ) {.    clea
12d0: 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65 77  rSelect(db, pNew
12e0: 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  , pNew!=&standin
12f0: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  );.    pNew = 0;
1300: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1310: 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63  sert( pNew->pSrc
1320: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  !=0 || pParse->n
1330: 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61  Err>0 );.  }.  a
1340: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74  ssert( pNew!=&st
1350: 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72  andin );.  retur
1360: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53  n pNew;.}..#if S
1370: 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
1380: 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  ED./*.** Set the
1390: 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65 63   name of a Selec
13a0: 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64  t object.*/.void
13b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
13c0: 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c  tName(Select *p,
13d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
13e0: 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20  me){.  if( p && 
13f0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  zName ){.    sql
1400: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1410: 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65  zeof(p->zSelName
1420: 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20  ), p->zSelName, 
1430: 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  "%s", zName);.  
1440: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
1450: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69  ** Delete the gi
1460: 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63  ven Select struc
1470: 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ture and all of 
1480: 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
1490: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
14a0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73  e3SelectDelete(s
14b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
14c0: 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  ct *p){.  if( p 
14d0: 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62  ) clearSelect(db
14e0: 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , p, 1);.}../*.*
14f0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1500: 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  er to the right-
1510: 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
1520: 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f  ement in a compo
1530: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  und..*/.static S
1540: 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74  elect *findRight
1550: 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b  most(Select *p){
1560: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65  .  while( p->pNe
1570: 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78  xt ) p = p->pNex
1580: 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  t;.  return p;.}
1590: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20  ../*.** Given 1 
15a0: 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73  to 3 identifiers
15b0: 20 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a   preceding the J
15c0: 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74  OIN keyword, det
15d0: 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79  ermine the.** ty
15e0: 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74  pe of join.  Ret
15f0: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63  urn an integer c
1600: 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70  onstant that exp
1610: 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65  resses that type
1620: 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  .** in terms of 
1630: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69  the following bi
1640: 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20  t values:.**.** 
1650: 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20      JT_INNER.** 
1660: 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20      JT_CROSS.** 
1670: 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20      JT_OUTER.** 
1680: 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a      JT_NATURAL.*
1690: 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a  *     JT_LEFT.**
16a0: 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a       JT_RIGHT.**
16b0: 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72  .** A full outer
16c0: 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d   join is the com
16d0: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c  bination of JT_L
16e0: 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54  EFT and JT_RIGHT
16f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c  ..**.** If an il
1700: 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f  legal or unsuppo
1710: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69  rted join type i
1720: 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69  s seen, then sti
1730: 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a  ll return.** a j
1740: 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75  oin type, but pu
1750: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  t an error in th
1760: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
1770: 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
1780: 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65  e3JoinType(Parse
1790: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
17a0: 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20  *pA, Token *pB, 
17b0: 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e  Token *pC){.  in
17c0: 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  t jointype = 0;.
17d0: 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33    Token *apAll[3
17e0: 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20  ];.  Token *p;. 
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1810: 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34   0123456789 1234
1820: 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20  56789 123456789 
1830: 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  123 */.  static 
1840: 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54  const char zKeyT
1850: 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c  ext[] = "natural
1860: 65 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c  eftouterightfull
1870: 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73  innercross";.  s
1880: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
1890: 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20  ct {.    u8 i;  
18a0: 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
18b0: 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65  ng of keyword te
18c0: 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d  xt in zKeyText[]
18d0: 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72   */.    u8 nChar
18e0: 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f  ;    /* Length o
18f0: 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e  f the keyword in
1900: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
1910: 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20     u8 code;     
1920: 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73  /* Join type mas
1930: 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72  k */.  } aKeywor
1940: 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e  d[] = {.    /* n
1950: 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20  atural */ { 0,  
1960: 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20  7, JT_NATURAL   
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1980: 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a      /* left    *
1990: 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45  / { 6,  4, JT_LE
19a0: 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  FT|JT_OUTER     
19b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f       },.    /* o
19c0: 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20  uter   */ { 10, 
19d0: 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  5, JT_OUTER     
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
19f0: 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a      /* right   *
1a00: 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49  / { 14, 5, JT_RI
1a10: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20  GHT|JT_OUTER    
1a20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66       },.    /* f
1a30: 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20  ull    */ { 19, 
1a40: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
1a50: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
1a60: 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a      /* inner   *
1a70: 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e  / { 23, 5, JT_IN
1a80: 4e 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  NER             
1a90: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63       },.    /* c
1aa0: 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20  ross   */ { 28, 
1ab0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43  5, JT_INNER|JT_C
1ac0: 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a  ROSS         },.
1ad0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b    };.  int i, j;
1ae0: 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41  .  apAll[0] = pA
1af0: 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70  ;.  apAll[1] = p
1b00: 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20  B;.  apAll[2] = 
1b10: 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  pC;.  for(i=0; i
1b20: 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20  <3 && apAll[i]; 
1b30: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70  i++){.    p = ap
1b40: 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  All[i];.    for(
1b50: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
1b60: 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29  (aKeyword); j++)
1b70: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  {.      if( p->n
1b80: 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43  ==aKeyword[j].nC
1b90: 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26  har .          &
1ba0: 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
1bb0: 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26  p((char*)p->z, &
1bc0: 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72  zKeyText[aKeywor
1bd0: 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d  d[j].i], p->n)==
1be0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69  0 ){.        joi
1bf0: 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72  ntype |= aKeywor
1c00: 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20  d[j].code;.     
1c10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  }.    }.    test
1c30: 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d  case( j==0 || j=
1c40: 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d  =1 || j==2 || j=
1c50: 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d  =3 || j==4 || j=
1c60: 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20  =5 || j==6 );.  
1c70: 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69    if( j>=ArraySi
1c80: 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a  ze(aKeyword) ){.
1c90: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1ca0: 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20  = JT_ERROR;.    
1cb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1cc0: 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a   }.  if(.     (j
1cd0: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e  ointype & (JT_IN
1ce0: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d  NER|JT_OUTER))==
1cf0: 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54  (JT_INNER|JT_OUT
1d00: 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69  ER) ||.     (joi
1d10: 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52  ntype & JT_ERROR
1d20: 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f  )!=0.  ){.    co
1d30: 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20  nst char *zSp = 
1d40: 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " ";.    assert(
1d50: 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   pB!=0 );.    if
1d60: 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b  ( pC==0 ){ zSp++
1d70: 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ; }.    sqlite3E
1d80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1d90: 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75  "unknown or unsu
1da0: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
1db0: 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20  e: ".       "%T 
1dc0: 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c  %T%s%T", pA, pB,
1dd0: 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a   zSp, pC);.    j
1de0: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1df0: 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ER;.  }else if( 
1e00: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  (jointype & JT_O
1e10: 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20  UTER)!=0 .      
1e20: 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20     && (jointype 
1e30: 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  & (JT_LEFT|JT_RI
1e40: 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29  GHT))!=JT_LEFT )
1e50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1e60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
1e70: 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20       "RIGHT and 
1e80: 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73  FULL OUTER JOINs
1e90: 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74   are not current
1ea0: 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ly supported");.
1eb0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1ec0: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72  T_INNER;.  }.  r
1ed0: 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a  eturn jointype;.
1ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ef0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
1f00: 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65  olumn in a table
1f10: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
1f20: 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73  the column.** is
1f30: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
1f40: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  n the table..*/.
1f50: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d  static int colum
1f60: 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  nIndex(Table *pT
1f70: 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ab, const char *
1f80: 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
1f90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1fa0: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
1fb0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1fc0: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
1fd0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [i].zName, zCol)
1fe0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
1ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
2000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
2010: 20 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62   the first N tab
2020: 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f  les in pSrc, fro
2030: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c  m left to right,
2040: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a   looking for a.*
2050: 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73  * table that has
2060: 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20   a column named 
2070: 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  zCol.  .**.** Wh
2080: 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70  en found, set *p
2090: 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20  iTab and *piCol 
20a0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64  to the table ind
20b0: 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e  ex and column in
20c0: 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61  dex.** of the ma
20d0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e  tching column an
20e0: 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a  d return TRUE..*
20f0: 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e  *.** If not foun
2100: 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  d, return FALSE.
2110: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2120: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
2130: 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ex(.  SrcList *p
2140: 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72  Src,       /* Ar
2150: 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ray of tables to
2160: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74   search */.  int
2170: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
2180: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2190: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61  ables in pSrc->a
21a0: 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  [] to search */.
21b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
21c0: 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ol,    /* Name o
21d0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20  f the column we 
21e0: 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  are looking for 
21f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c  */.  int *piTab,
2200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2210: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
2220: 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20  ->a[] here */.  
2230: 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20  int *piCol      
2240: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e       /* Write in
2250: 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a  dex of pSrc->a[*
2260: 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f  piTab].pTab->aCo
2270: 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  l[] here */.){. 
2280: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2290: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
22a0: 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
22b0: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
22c0: 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
22d0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
22e0: 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a  olumn matching z
22f0: 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  Col */..  assert
2300: 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70  ( (piTab==0)==(p
2310: 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20  iCol==0) );  /* 
2320: 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20  Both or neither 
2330: 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f  are NULL */.  fo
2340: 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29  r(i=0; i<N; i++)
2350: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c  {.    iCol = col
2360: 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61  umnIndex(pSrc->a
2370: 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b  [i].pTab, zCol);
2380: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  .    if( iCol>=0
2390: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69   ){.      if( pi
23a0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Tab ){.        *
23b0: 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20  piTab = i;.     
23c0: 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c     *piCol = iCol
23d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
23f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2400: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2410: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2420: 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c  o add terms impl
2430: 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74  ied by JOIN synt
2440: 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45  ax to the.** WHE
2450: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
2460: 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54  sion of a SELECT
2470: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20   statement. The 
2480: 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a  new term, which.
2490: 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68  ** is ANDed with
24a0: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48   the existing WH
24b0: 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f  ERE clause, is o
24c0: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
24d0: 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20  *    (tab1.col1 
24e0: 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a  = tab2.col2).**.
24f0: 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73  ** where tab1 is
2500: 20 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62   the iSrc'th tab
2510: 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53  le in SrcList pS
2520: 72 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74  rc and tab2 is t
2530: 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27  he .** (iSrc+1)'
2540: 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20  th. Column col1 
2550: 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65  is column iColLe
2560: 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20  ft of tab1, and 
2570: 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d  col2 is.** colum
2580: 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74  n iColRight of t
2590: 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ab2..*/.static v
25a0: 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d  oid addWhereTerm
25b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
25c0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
25d0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
25e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
25f0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
2600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2610: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
2620: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2630: 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20    int iLeft,    
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
2660: 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69  rst table to joi
2670: 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  n in pSrc */.  i
2680: 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20  nt iColLeft,    
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
26b0: 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65  n in first table
26c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74   */.  int iRight
26d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
26f0: 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69  f second table i
2700: 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  n pSrc */.  int 
2710: 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20  iColRight,      
2720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2730: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
2740: 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a  n second table *
2750: 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a  /.  int isOuterJ
2760: 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  oin,            
2770: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2780: 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20  his is an OUTER 
2790: 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  join */.  Expr *
27a0: 2a 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20  *ppWhere        
27b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
27c0: 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63  OUT: The WHERE c
27d0: 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20  lause to add to 
27e0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
27f0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
2800: 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20  ;.  Expr *pE1;. 
2810: 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78   Expr *pE2;.  Ex
2820: 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65  pr *pEq;..  asse
2830: 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74  rt( iLeft<iRight
2840: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2850: 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20  rc->nSrc>iRight 
2860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2870: 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62  c->a[iLeft].pTab
2880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2890: 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54  rc->a[iRight].pT
28a0: 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73  ab );..  pE1 = s
28b0: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
28c0: 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c  mnExpr(db, pSrc,
28d0: 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74   iLeft, iColLeft
28e0: 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74  );.  pE2 = sqlit
28f0: 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78  e3CreateColumnEx
2900: 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69  pr(db, pSrc, iRi
2910: 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b  ght, iColRight);
2920: 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65  ..  pEq = sqlite
2930: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2940: 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 2c 20  K_EQ, pE1, pE2, 
2950: 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26  0);.  if( pEq &&
2960: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a   isOuterJoin ){.
2970: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2980: 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d  rty(pEq, EP_From
2990: 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Join);.    asser
29a0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
29b0: 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65  rty(pEq, EP_Toke
29c0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
29d0: 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ) );.    ExprSet
29e0: 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c  VVAProperty(pEq,
29f0: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2a00: 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f     pEq->iRightJo
2a10: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70  inTable = (i16)p
2a20: 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a  E2->iTable;.  }.
2a30: 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c    *ppWhere = sql
2a40: 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
2a50: 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a  *ppWhere, pEq);.
2a60: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2a70: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
2a80: 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72  perty on all ter
2a90: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
2aa0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41  expression..** A
2ab0: 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e  nd set the Expr.
2ac0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2ad0: 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76  to iTable for ev
2ae0: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  ery term in the.
2af0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
2b00: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
2b10: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
2b20: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
2b30: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
2b40: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
2b50: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
2b60: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
2b70: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
2b80: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
2b90: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
2ba0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
2bb0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2bc0: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
2bd0: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
2be0: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
2bf0: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
2c00: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
2c10: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
2c20: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
2c30: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
2c40: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
2c50: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
2c60: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
2c70: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
2c80: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
2c90: 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52  *.** The Expr.iR
2ca0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65  ightJoinTable te
2cb0: 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c  lls the WHERE cl
2cc0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
2cd0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72  that the.** expr
2ce0: 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f  ession depends o
2cf0: 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f  n table iRightJo
2d00: 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20  inTable even if 
2d10: 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f  that table is no
2d20: 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20  t.** explicitly 
2d30: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
2d40: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
2d50: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  at information i
2d60: 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20  s needed.** for 
2d70: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a  cases like this:
2d80: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2d90: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
2da0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
2db0: 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a  t2.b AND t1.x=5.
2dc0: 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20  **.** The where 
2dd0: 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20  clause needs to 
2de0: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
2df0: 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35  ng of the t1.x=5
2e00: 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61  .** term until a
2e10: 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70  fter the t2 loop
2e20: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49   of the join.  I
2e30: 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a  n that way, a.**
2e40: 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c   NULL t2 row wil
2e50: 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68  l be inserted wh
2e60: 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20  enever t1.x!=5. 
2e70: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a   If we do not.**
2e80: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2e90: 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69  ing of t1.x=5, i
2ea0: 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73  t will be proces
2eb0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  sed immediately.
2ec0: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20  ** after the t1 
2ed0: 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69  loop and rows wi
2ee0: 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20  th t1.x!=5 will 
2ef0: 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a  never appear in.
2f00: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77  ** the output, w
2f10: 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63  hich is incorrec
2f20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2f30: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
2f40: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
2f50: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
2f60: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2f70: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
2f80: 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Join);.    asser
2f90: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2fa0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
2fb0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2fc0: 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56  );.    ExprSetVV
2fd0: 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  AProperty(p, EP_
2fe0: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2ff0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
3000: 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b  e = (i16)iTable;
3010: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
3020: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70  TK_FUNCTION && p
3030: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
3040: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
3050: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e  for(i=0; i<p->x.
3060: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3070: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 4a  +){.        setJ
3080: 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69  oinExpr(p->x.pLi
3090: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
30a0: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d  iTable);.      }
30b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a 6f  .    }.    setJo
30c0: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
30d0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
30e0: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
30f0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
3100: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
3110: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
3120: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
3130: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
3140: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
3150: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
3160: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
3170: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
3180: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
3190: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
31a0: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
31b0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
31c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
31d0: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
31e0: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
31f0: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
3200: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
3210: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
3220: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
3230: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
3240: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
3250: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
3260: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
3270: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
3280: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
3290: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
32a0: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
32b0: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
32c0: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
32d0: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
32e0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
32f0: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
3300: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
3310: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
3320: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
3330: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
3340: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
3350: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
3360: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
3370: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
3380: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
3390: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
33a0: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
33b0: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
33c0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
33d0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
33e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33f0: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
3400: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3410: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
3420: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
3430: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
3440: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
3450: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3460: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
3470: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
3480: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
3490: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
34a0: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
34b0: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
34c0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
34d0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
34e0: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
34f0: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
3500: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
3510: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
3520: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
3530: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
3540: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65  {.    Table *pLe
3550: 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70  ftTab = pLeft->p
3560: 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Tab;.    Table *
3570: 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67  pRightTab = pRig
3580: 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e  ht->pTab;.    in
3590: 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20  t isOuter;..    
35a0: 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54  if( NEVER(pLeftT
35b0: 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54  ab==0 || pRightT
35c0: 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  ab==0) ) continu
35d0: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
35e0: 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69   (pRight->fg.joi
35f0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
3600: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
3610: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
3620: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
3630: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
3640: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
3650: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
3660: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
3670: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
3680: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
3690: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e   if( pRight->fg.
36a0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
36b0: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
36c0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c  f( pRight->pOn |
36d0: 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  | pRight->pUsing
36e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3700: 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a  se, "a NATURAL j
3710: 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  oin may not have
3720: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
3730: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
3740: 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  ause", 0);.     
3750: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3760: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
3770: 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d  =0; j<pRightTab-
3780: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
3790: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
37a0: 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  ;   /* Name of c
37b0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67  olumn in the rig
37c0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ht table */.    
37d0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
37e0: 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c     /* Matching l
37f0: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eft table */.   
3800: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f       int iLeftCo
3810: 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20  l;  /* Matching 
3820: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65  column in the le
3830: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  ft table */..   
3840: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69       zName = pRi
3850: 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ghtTab->aCol[j].
3860: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3870: 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  f( tableAndColum
3880: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3890: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
38a0: 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20   &iLeftCol) ){. 
38b0: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
38c0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
38d0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
38e0: 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20  Col, i+1, j,.   
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
3910: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
3920: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3930: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
3940: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
3950: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
3960: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
3970: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3980: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
3990: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
39a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
39b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
39c0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
39d0: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
39e0: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
39f0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
3a00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
3a10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3a20: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
3a30: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
3a40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3a50: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
3a60: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
3a70: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
3a80: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3a90: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
3aa0: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
3ab0: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
3ac0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
3ad0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
3ae0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
3af0: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
3b00: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67   p->pWhere, pRig
3b10: 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ht->pOn);.      
3b20: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b  pRight->pOn = 0;
3b30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
3b40: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
3b50: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
3b60: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
3b70: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
3b80: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
3b90: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
3ba0: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
3bb0: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
3bc0: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
3bd0: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
3be0: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
3bf0: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
3c00: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
3c10: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
3c20: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
3c30: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
3c40: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
3c50: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
3c60: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
3c70: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
3c80: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
3c90: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
3ca0: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
3cb0: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
3cc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3cd0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
3ce0: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
3cf0: 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d  *pList = pRight-
3d00: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
3d10: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
3d20: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
3d30: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
3d40: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3d50: 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20  the term in the 
3d60: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a  USING clause */.
3d70: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3d80: 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  t;       /* Tabl
3d90: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69  e on the left wi
3da0: 74 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  th matching colu
3db0: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
3dc0: 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b     int iLeftCol;
3dd0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3de0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
3df0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c   column on the l
3e00: 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  eft */.        i
3e10: 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20  nt iRightCol;   
3e20: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
3e30: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
3e40: 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74  umn on the right
3e50: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61   */..        zNa
3e60: 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  me = pList->a[j]
3e70: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3e80: 69 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75  iRightCol = colu
3e90: 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61  mnIndex(pRightTa
3ea0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
3eb0: 20 20 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c     if( iRightCol
3ec0: 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21  <0.         || !
3ed0: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
3ee0: 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a  dex(pSrc, i+1, z
3ef0: 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69  Name, &iLeft, &i
3f00: 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20  LeftCol).       
3f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
3f20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3f30: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
3f40: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
3f50: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
3f60: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
3f70: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
3f80: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
3f90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3fa0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
3fb0: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
3fc0: 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c  rm(pParse, pSrc,
3fd0: 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c   iLeft, iLeftCol
3fe0: 2c 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c  , i+1, iRightCol
3ff0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4000: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
4010: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
4020: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
4030: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4040: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
4050: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  ce */.static Key
4060: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
4070: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
4080: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4090: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
40a0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
40b0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
40c0: 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e  * Form the KeyIn
40d0: 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74  fo object from t
40e0: 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a  his ExprList */.
40f0: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
4100: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
4110: 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e  with this column
4120: 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69   of pList */.  i
4130: 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20  nt nExtra       
4140: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
4150: 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d  many extra colum
4160: 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f  ns to the end */
4170: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .);../*.** Gener
4180: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
4190: 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f  ll push the reco
41a0: 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  rd in registers 
41b0: 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75  regData.** throu
41c0: 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74 61  gh regData+nData
41d0: 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74  -1 onto the sort
41e0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
41f0: 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  id pushOntoSorte
4200: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
4210: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se,         /* P
4220: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4230: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
4240: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  t,        /* Inf
4250: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
4260: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
4270: 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  se */.  Select *
4280: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f  pSelect,       /
4290: 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45  * The whole SELE
42a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
42b0: 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20 20    int regData,  
42c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
42d0: 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  t register holdi
42e0: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  ng data to be so
42f0: 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rted */.  int re
4300: 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20 20  gOrigData,      
4310: 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73 74   /* First regist
4320: 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  er holding data 
4330: 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20 2a  before packing *
4340: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  /.  int nData,  
4350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4360: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
4370: 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72 72   in the data arr
4380: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  ay */.  int nPre
4390: 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20 2f  fixReg         /
43a0: 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69  * No. of reg pri
43b0: 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61 76  or to regData av
43c0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
43d0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
43e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74           /* Stmt
4410: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4420: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65  ion */.  int bSe
4430: 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72  q = ((pSort->sor
4440: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
4450: 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29  G_UseSorter)==0)
4460: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
4470: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
4480: 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  >nExpr;         
4490: 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f       /* No. of O
44a0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
44b0: 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e  .  int nBase = n
44c0: 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44  Expr + bSeq + nD
44d0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
44e0: 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e      /* Fields in
44f0: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4500: 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  /.  int regBase;
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72       /* Regs for
4540: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4550: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
4560: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
4570: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
4580: 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65       /* Assemble
4590: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
45a0: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20  */.  int nOBSat 
45b0: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42        /* ORDER B
45e0: 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20  Y terms to skip 
45f0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
4620: 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20  e to add sorter 
4630: 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72  record to sorter
4640: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   */.  int iLimit
4650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4660: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49           /* LIMI
4670: 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  T counter */..  
4680: 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20  assert( bSeq==0 
4690: 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20  || bSeq==1 );.  
46a0: 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 31  assert( nData==1
46b0: 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65 67   || regData==reg
46c0: 4f 72 69 67 44 61 74 61 20 29 3b 0a 20 20 69 66  OrigData );.  if
46d0: 28 20 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a  ( nPrefixReg ){.
46e0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65      assert( nPre
46f0: 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53  fixReg==nExpr+bS
4700: 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73  eq );.    regBas
4710: 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45  e = regData - nE
4720: 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65  xpr - bSeq;.  }e
4730: 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65  lse{.    regBase
4740: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
4750: 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  + 1;.    pParse-
4760: 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a  >nMem += nBase;.
4770: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53    }.  assert( pS
4780: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d  elect->iOffset==
4790: 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c  0 || pSelect->iL
47a0: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69  imit!=0 );.  iLi
47b0: 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69  mit = pSelect->i
47c0: 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74  Offset ? pSelect
47d0: 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53  ->iOffset+1 : pS
47e0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
47f0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
4800: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
4810: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73  akeLabel(v);.  s
4820: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
4830: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
4840: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Sort->pOrderBy, 
4850: 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67  regBase, regOrig
4860: 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20  Data,.          
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c  SQLITE_ECEL_DUP|
4890: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
48a0: 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a  ;.  if( bSeq ){.
48b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
48c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
48d0: 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43  ence, pSort->iEC
48e0: 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e  ursor, regBase+n
48f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Expr);.  }.  if(
4900: 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20 29   nPrefixReg==0 )
4910: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4920: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
4930: 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42 61  , regData, regBa
4940: 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e  se+nExpr+bSeq, n
4950: 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Data);.  }.  sql
4960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4970: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4980: 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c   regBase+nOBSat,
4990: 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72   nBase-nOBSat, r
49a0: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  egRecord);.  if(
49b0: 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20   nOBSat>0 ){.   
49c0: 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b   int regPrevKey;
49d0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
49e0: 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f  nOBSat columns o
49f0: 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  f the previous r
4a00: 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ow */.    int ad
4a10: 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41  drFirst;    /* A
4a20: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
4a30: 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f  _IfNot opcode */
4a40: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70  .    int addrJmp
4a50: 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
4a60: 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70  s of the OP_Jump
4a70: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56   opcode */.    V
4a80: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
4a90: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20   /* Opcode that 
4aa0: 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72  opens the sorter
4ab0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79   */.    int nKey
4ac0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
4ad0: 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b  ber of sorting k
4ae0: 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c  ey columns, incl
4af0: 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63  uding OP_Sequenc
4b00: 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  e */.    KeyInfo
4b10: 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72   *pKI;     /* Or
4b20: 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f  iginal KeyInfo o
4b30: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61 62  n the sorter tab
4b40: 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72  le */..    regPr
4b50: 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e  evKey = pParse->
4b60: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
4b70: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72  se->nMem += pSor
4b80: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e  t->nOBSat;.    n
4b90: 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53  Key = nExpr - pS
4ba0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53  ort->nOBSat + bS
4bb0: 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71  eq;.    if( bSeq
4bc0: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69   ){.      addrFi
4bd0: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
4be0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4bf0: 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  Not, regBase+nEx
4c00: 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b  pr); .    }else{
4c10: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4c20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4c30: 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp1(v, OP_Seque
4c40: 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e  nceTest, pSort->
4c50: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d  iECursor);.    }
4c60: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
4c70: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
4c80: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4c90: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72  P_Compare, regPr
4ca0: 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20  evKey, regBase, 
4cb0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a  pSort->nOBSat);.
4cc0: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
4cd0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53  3VdbeGetOp(v, pS
4ce0: 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64  ort->addrSortInd
4cf0: 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ex);.    if( pPa
4d00: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
4d10: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
4d20: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b      pOp->p2 = nK
4d30: 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20  ey + nData;.    
4d40: 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  pKI = pOp->p4.pK
4d50: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73  eyInfo;.    mems
4d60: 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64  et(pKI->aSortOrd
4d70: 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65  er, 0, pKI->nFie
4d80: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
4d90: 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74 65 73 74  _Jump below test
4da0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  able */.    sqli
4db0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
4dc0: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b  v, -1, (char*)pK
4dd0: 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  I, P4_KEYINFO);.
4de0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
4df0: 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a  I->nXField>2 );.
4e00: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79      pOp->p4.pKey
4e10: 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
4e20: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
4e30: 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  e, pSort->pOrder
4e40: 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20  By, nOBSat,.    
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69         pKI->nXFi
4e80: 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  eld-1);.    addr
4e90: 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Jmp = sqlite3Vdb
4ea0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
4eb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4ec0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
4ed0: 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c  p, addrJmp+1, 0,
4ee0: 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62   addrJmp+1); Vdb
4ef0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4f00: 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b    pSort->labelBk
4f10: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Out = sqlite3Vdb
4f20: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
4f30: 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74     pSort->regRet
4f40: 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
4f50: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
4f60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4f70: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
4f80: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
4f90: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
4fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4fb0: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
4fc0: 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69  Sorter, pSort->i
4fd0: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  ECursor);.    if
4fe0: 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ( iLimit ){.    
4ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5000: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
5010: 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e   iLimit, pSort->
5020: 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20  labelDone);.    
5030: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5040: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5050: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
5060: 28 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a  (v, addrFirst);.
5070: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5080: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
5090: 72 65 67 42 61 73 65 2c 20 72 65 67 50 72 65 76  regBase, regPrev
50a0: 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  Key, pSort->nOBS
50b0: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
50c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
50d0: 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20  addrJmp);.  }.  
50e0: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
50f0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
5100: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
5110: 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49   op = OP_SorterI
5120: 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nsert;.  }else{.
5130: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49      op = OP_IdxI
5140: 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  nsert;.  }.  sql
5150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5160: 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43  , op, pSort->iEC
5170: 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64  ursor, regRecord
5180: 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20  );.  if( iLimit 
5190: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
51a0: 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 30 3b  .    int r1 = 0;
51b0: 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
51c0: 20 73 6f 72 74 65 72 20 75 6e 74 69 6c 20 69 74   sorter until it
51d0: 20 63 6f 6e 74 61 69 6e 73 20 4c 49 4d 49 54 2b   contains LIMIT+
51e0: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 2e 20  OFFSET entries. 
51f0: 20 28 54 68 65 20 69 4c 69 6d 69 74 0a 20 20 20   (The iLimit.   
5200: 20 2a 2a 20 72 65 67 69 73 74 65 72 20 69 73 20   ** register is 
5210: 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74 68  initialized with
5220: 20 76 61 6c 75 65 20 6f 66 20 4c 49 4d 49 54 2b   value of LIMIT+
5230: 4f 46 46 53 45 54 2e 29 20 20 41 66 74 65 72 20  OFFSET.)  After 
5240: 74 68 65 20 73 6f 72 74 65 72 0a 20 20 20 20 2a  the sorter.    *
5250: 2a 20 66 69 6c 6c 73 20 75 70 2c 20 64 65 6c 65  * fills up, dele
5260: 74 65 20 74 68 65 20 6c 65 61 73 74 20 65 6e 74  te the least ent
5270: 72 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  ry in the sorter
5280: 20 61 66 74 65 72 20 65 61 63 68 20 69 6e 73 65   after each inse
5290: 72 74 2e 0a 20 20 20 20 2a 2a 20 54 68 75 73 20  rt..    ** Thus 
52a0: 77 65 20 6e 65 76 65 72 20 68 6f 6c 64 20 6d 6f  we never hold mo
52b0: 72 65 20 74 68 61 6e 20 74 68 65 20 4c 49 4d 49  re than the LIMI
52c0: 54 2b 4f 46 46 53 45 54 20 72 6f 77 73 20 69 6e  T+OFFSET rows in
52d0: 20 6d 65 6d 6f 72 79 20 61 74 20 6f 6e 63 65 20   memory at once 
52e0: 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  */.    addr = sq
52f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5300: 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c  v, OP_IfNotZero,
5310: 20 69 4c 69 6d 69 74 2c 20 30 2c 20 31 29 3b 20   iLimit, 0, 1); 
5320: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5330: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5340: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
5350: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
5360: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
5370: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5380: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5390: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
53a0: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
53b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
53c0: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
53d0: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
53e0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
53f0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
5400: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
5410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5420: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
5430: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
5440: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
5450: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
5460: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
5470: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5480: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5490: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
54a0: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
54b0: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
54c0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
54d0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
54e0: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
54f0: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
5500: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
5510: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
5520: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
5530: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
5540: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
5550: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
5560: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
5570: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5580: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5590: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
55a0: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
55b0: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
55c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
55d0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
55e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
55f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5600: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
5610: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
5620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5630: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
5640: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
5650: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5660: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5670: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5680: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
5690: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
56a0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
56b0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
56c0: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
56d0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
56e0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
56f0: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5700: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
5710: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
5720: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
5730: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
5740: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
5750: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
5760: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
5770: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5780: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5790: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
57a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
57b0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
57c0: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
57d0: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
57e0: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
57f0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
5800: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5810: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
5820: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
5830: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
5840: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
5850: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
5860: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
5870: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5880: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5890: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
58a0: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
58b0: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
58c0: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
58d0: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
58e0: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
58f0: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
5900: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
5910: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
5920: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
5930: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
5940: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
5950: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
5960: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
5970: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
5980: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
5990: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
59a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
59b0: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
59c0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
59d0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
59e0: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
59f0: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
5a00: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
5a10: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
5a20: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
5a30: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
5a40: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
5a50: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
5a60: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
5a70: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5a80: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
5a90: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
5aa0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
5ab0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
5ac0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
5ad0: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
5ae0: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
5af0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5b00: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
5b10: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5b20: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
5b30: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
5b40: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
5b50: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
5b60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5b70: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5b80: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
5b90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ba0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5bb0: 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20  t, iTab, r1);.  
5bc0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
5bd0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
5be0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
5bf0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5c00: 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
5c10: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
5c20: 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  ge when a SELECT
5c30: 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20   is used within 
5c40: 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  a subexpression.
5c50: 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61  ** (example:  "a
5c60: 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52   IN (SELECT * FR
5c70: 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74 20  OM table)") but 
5c80: 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  it has more than
5c90: 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c   1 result.** col
5ca0: 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73  umn.  We do this
5cb0: 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65   in a subroutine
5cc0: 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72 72   because the err
5cd0: 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72  or used to occur
5ce0: 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  .** in multiple 
5cf0: 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65 72  places.  (The er
5d00: 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  ror only occurs 
5d10: 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77  in one place now
5d20: 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61  , but we.** reta
5d30: 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  in the subroutin
5d40: 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f  e to minimize co
5d50: 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a  de disruption.).
5d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
5d70: 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
5d80: 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20  nSelectError(.  
5d90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5da0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
5db0: 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65  ntext. */.  Sele
5dc0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
5dd0: 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
5de0: 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  of SELECT result
5df0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72  s */.  int nExpr
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5e10: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
5e20: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
5e30: 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b   by SELECT */.){
5e40: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
5e50: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
5e60: 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65  f( nExpr>1 && (e
5e70: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
5e80: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
5e90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5ea0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5eb0: 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72  "only a single r
5ec0: 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f  esult allowed fo
5ed0: 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45  r ".       "a SE
5ee0: 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
5ef0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
5f00: 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  on");.    return
5f10: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
5f20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
5f30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
5f40: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
5f50: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
5f60: 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66  or the inside of
5f70: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
5f80: 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a  ** of a SELECT..
5f90: 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20  **.** If srcTab 
5fa0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
5fb0: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
5fc0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
5fd0: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
5fe0: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
5ff0: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
6000: 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a    If srcTab is.*
6010: 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20  * zero or more, 
6020: 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c  then data is pul
6030: 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20  led from srcTab 
6040: 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73  and pEList is us
6050: 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67  ed only .** to g
6060: 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d 6e  et number column
6070: 73 20 61 6e 64 20 74 68 65 20 64 61 74 61 74 79  s and the dataty
6080: 70 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  pe for each colu
6090: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
60a0: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
60b0: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
60c0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
60d0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
60e0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
60f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
6100: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
6110: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
6120: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
6130: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
6140: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
6150: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69  st of values bei
6160: 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ng extracted */.
6170: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
6180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
6190: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
61a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72 74   table */.  Sort
61b0: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
61c0: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
61d0: 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20  LL, info on how 
61e0: 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52  to process ORDER
61f0: 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63   BY */.  Distinc
6200: 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c  tCtx *pDistinct,
6210: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
6220: 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   info on how to 
6230: 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54  process DISTINCT
6240: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
6250: 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
6260: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
6270: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
6280: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
6290: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
62a0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
62b0: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
62c0: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
62d0: 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
62e0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
62f0: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
6300: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29   inner loop */.)
6310: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
6320: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
6330: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
6340: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
6350: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
6360: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
6370: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
6380: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
6390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
63a0: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
63b0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65  olding result se
63c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  t */.  int eDest
63d0: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
63e0: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
63f0: 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20  pose of results 
6400: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  */.  int iParm =
6410: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
6420: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
6430: 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d  nt to disposal m
6440: 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ethod */.  int n
6450: 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20  ResultCol;      
6460: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6470: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
6480: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  ns */.  int nPre
6490: 66 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20  fixReg = 0;     
64a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
64b0: 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
64c0: 20 62 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c   before regResul
64d0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
64e0: 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  v );.  assert( p
64f0: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61  EList!=0 );.  ha
6500: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73  sDistinct = pDis
6510: 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63  tinct ? pDistinc
6520: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57  t->eTnctType : W
6530: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
6540: 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20  OP;.  if( pSort 
6550: 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  && pSort->pOrder
6560: 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20  By==0 ) pSort = 
6570: 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  0;.  if( pSort==
6580: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
6590: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
65a0: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b   iContinue!=0 );
65b0: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
65c0: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
65d0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a  Continue);.  }..
65e0: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
65f0: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
6600: 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43  .  */.  nResultC
6610: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
6620: 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74  pr;..  if( pDest
6630: 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
6640: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
6650: 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67 20       nPrefixReg 
6660: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
6670: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
6680: 69 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72  if( !(pSort->sor
6690: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
66a0: 47 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e  G_UseSorter) ) n
66b0: 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20  PrefixReg++;.   
66c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
66d0: 2b 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20  += nPrefixReg;. 
66e0: 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e     }.    pDest->
66f0: 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e  iSdst = pParse->
6700: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
6710: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
6720: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20  ultCol;.  }else 
6730: 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
6740: 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50  +nResultCol > pP
6750: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20  arse->nMem ){.  
6760: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
6770: 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  error condition 
6780: 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c  that can result,
6790: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
67a0: 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20  en a SELECT.    
67b0: 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  ** on the right-
67c0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20  hand side of an 
67d0: 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20  INSERT contains 
67e0: 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  more result colu
67f0: 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  mns than.    ** 
6800: 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e  there are column
6810: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  s in the table o
6820: 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65  n the left.  The
6830: 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63   error will be c
6840: 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64  aught.    ** and
6850: 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e   reported later.
6860: 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f    But we need to
6870: 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67   make sure enoug
6880: 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f  h memory is allo
6890: 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20  cated.    ** to 
68a0: 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72  avoid other spur
68b0: 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74  ious errors in t
68c0: 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a  he meantime. */.
68d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
68e0: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
68f0: 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64    }.  pDest->nSd
6900: 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  st = nResultCol;
6910: 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70  .  regResult = p
6920: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69  Dest->iSdst;.  i
6930: 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a  f( srcTab>=0 ){.
6940: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6950: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
6960: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6970: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
6980: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
6990: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a  , regResult+i);.
69a0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
69b0: 74 28 28 76 2c 20 22 25 73 22 2c 20 70 45 4c 69  t((v, "%s", pELi
69c0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29  st->a[i].zName))
69d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
69e0: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  if( eDest!=SRT_E
69f0: 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20  xists ){.    /* 
6a00: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
6a10: 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28  on is an EXISTS(
6a20: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c  ...) expression,
6a30: 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20   the actual.    
6a40: 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  ** values return
6a50: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
6a60: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
6a70: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38  d..    */.    u8
6a80: 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20   ecelFlags;.    
6a90: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
6aa0: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
6ab0: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
6ac0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6ad0: 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  ){.      ecelFla
6ae0: 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs = SQLITE_ECEL
6af0: 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _DUP;.    }else{
6b00: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
6b10: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
6b20: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
6b30: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
6b40: 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c  pEList, regResul
6b50: 74 2c 20 30 2c 20 65 63 65 6c 46 6c 61 67 73 29  t, 0, ecelFlags)
6b60: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6b70: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
6b80: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
6b90: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
6ba0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
6bb0: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
6bc0: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
6bd0: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
6be0: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
6bf0: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
6c00: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
6c10: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
6c20: 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e   switch( pDistin
6c30: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b  ct->eTnctType ){
6c40: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6c50: 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
6c60: 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  ED: {.        Vd
6c70: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
6c80: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
6c90: 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
6ca0: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
6cb0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
6cc0: 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iJump;          
6cd0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
6ce0: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ination */.     
6cf0: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20     int regPrev; 
6d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
6d10: 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65  evious row conte
6d20: 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  nt */..        /
6d30: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
6d40: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
6d50: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  s row */.       
6d60: 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
6d70: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
6d80: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
6d90: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a  += nResultCol;..
6da0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
6db0: 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
6dc0: 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
6dd0: 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75  lier to an OP_Nu
6de0: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ll.        ** se
6df0: 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  ts the MEM_Clear
6e00: 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69  ed bit on the fi
6e10: 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20  rst register of 
6e20: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
6e30: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20  revious value.  
6e40: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
6e50: 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20  the OP_Ne below 
6e60: 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  to always.      
6e70: 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65    ** fail on the
6e80: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
6e90: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65   of the loop eve
6ea0: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  n if the first. 
6eb0: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73         ** row is
6ec0: 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20   all NULLs..    
6ed0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
6ee0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6ef0: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
6f00: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
6f10: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
6f20: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
6f30: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
6f40: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
6f50: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
6f60: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
6f70: 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20  Op->p1 = 1;.    
6f80: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
6f90: 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20  gPrev;..        
6fa0: 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  iJump = sqlite3V
6fb0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6fc0: 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  ) + nResultCol;.
6fd0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
6fe0: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6ff0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
7000: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
7010: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
7020: 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  eq(pParse, pELis
7030: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
7040: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
7050: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a  nResultCol-1 ){.
7060: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7070: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7080: 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c   OP_Ne, regResul
7090: 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50  t+i, iJump, regP
70a0: 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  rev+i);.        
70b0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
70c0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
70d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
70e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
70f0: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65  Op3(v, OP_Eq, re
7100: 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74  gResult+i, iCont
7110: 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29  inue, regPrev+i)
7120: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
7130: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
7140: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7160: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
7170: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
7180: 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
7190: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
71a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
71b0: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
71c0: 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Q);.        }.  
71d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
71e0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
71f0: 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c  Addr(v)==iJump |
7200: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
7210: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
7220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7230: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
7240: 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72  py, regResult, r
7250: 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43  egPrev, nResultC
7260: 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62  ol-1);.        b
7270: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
7280: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
7290: 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a  DISTINCT_UNIQUE:
72a0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
72b0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
72c0: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
72d0: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
72e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
72f0: 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c   }..      defaul
7300: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t: {.        ass
7310: 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  ert( pDistinct->
7320: 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
7330: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
7340: 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63  RED );.        c
7350: 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
7360: 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74  se, pDistinct->t
7370: 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75  abTnct, iContinu
7380: 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20  e, nResultCol,. 
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b 0a      regResult);.
73b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
73c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
73d0: 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b   if( pSort==0 ){
73e0: 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65  .      codeOffse
73f0: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
7400: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
7410: 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68   }.  }..  switch
7420: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ( eDest ){.    /
7430: 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20  * In this mode, 
7440: 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79  write each query
7450: 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b   result to the k
7460: 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  ey of the tempor
7470: 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ary.    ** table
7480: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23   iParm..    */.#
7490: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
74a0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
74b0: 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  CT.    case SRT_
74c0: 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69  Union: {.      i
74d0: 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20  nt r1;.      r1 
74e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
74f0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7510: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
7520: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
7530: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31  , nResultCol, r1
7540: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7550: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7560: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7570: 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  m, r1);.      sq
7580: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7590: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
75a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
75b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
75c0: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
75d0: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
75e0: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
75f0: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
7600: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
7610: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
7620: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
7630: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
7640: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
7650: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
7660: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
7670: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  cept: {.      sq
7680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7690: 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c  v, OP_IdxDelete,
76a0: 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c   iParm, regResul
76b0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
76c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
76d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
76e0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
76f0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20  D_SELECT */..   
7700: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
7710: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
7720: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
7730: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
7740: 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63   SRT_Fifo:.    c
7750: 61 73 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  ase SRT_DistFifo
7760: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  :.    case SRT_T
7770: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
7780: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
7790: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
77a0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
77b0: 65 28 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69  e(pParse, nPrefi
77c0: 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74  xReg+1);.      t
77d0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
77e0: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
77f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7800: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
7810: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7820: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46  se( eDest==SRT_F
7830: 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ifo );.      tes
7840: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7850: 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
7860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7870: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
7880: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
7890: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
78a0: 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23  1+nPrefixReg);.#
78b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
78c0: 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28  IT_CTE.      if(
78d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
78e0: 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Fifo ){.        
78f0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
7900: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66  ation is DistFif
7910: 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  o, then cursor (
7920: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
7930: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
7940: 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
7950: 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  x. If the curren
7960: 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79  t row is already
7970: 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20   present.       
7980: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
7990: 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69  , do not write i
79a0: 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  t to the output.
79b0: 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65   If not, add the
79c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72  .        ** curr
79d0: 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69  ent row to the i
79e0: 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64  ndex and proceed
79f0: 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69 74   with writing it
7a00: 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
7a10: 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20  ** output table 
7a20: 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20  as well.  */.   
7a30: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
7a40: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
7a50: 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20  ntAddr(v) + 4;. 
7a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7a70: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
7a80: 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31  P_Found, iParm+1
7a90: 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a  , addr, r1, 0);.
7aa0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
7ab0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
7ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7ad0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
7ae0: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 29  rt, iParm+1, r1)
7af0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7b00: 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20  ( pSort==0 );.  
7b10: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
7b20: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7b30: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7b40: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7b50: 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65  Sort, p, r1+nPre
7b60: 66 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74  fixReg,regResult
7b70: 2c 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  ,1,nPrefixReg);.
7b80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7b90: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
7ba0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
7bb0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
7bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7bd0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
7be0: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
7bf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7c00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
7c10: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
7c20: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
7c30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7c40: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
7c50: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
7c60: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7c70: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
7c80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7c90: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7ca0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
7cb0: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  1, nPrefixReg+1)
7cc0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7cd0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
7ce0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7cf0: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
7d00: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
7d10: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
7d20: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
7d30: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
7d40: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
7d50: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
7d60: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
7d70: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
7d80: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
7d90: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
7da0: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
7db0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
7dc0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
7dd0: 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74   assert( nResult
7de0: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
7df0: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
7e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7e10: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
7e20: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
7e30: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
7e40: 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
7e50: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
7e60: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
7e70: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
7e80: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
7e90: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
7ea0: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
7eb0: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
7ec0: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
7ed0: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
7ee0: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
7ef0: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
7f00: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
7f10: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
7f20: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
7f30: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
7f40: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
7f50: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
7f60: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7f70: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7f80: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
7f90: 6c 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31  lt, regResult, 1
7fa0: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
7fb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7fc0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
7fd0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
7fe0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
7ff0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8000: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
8010: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 31 2c  rd, regResult,1,
8020: 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53  r1, &pDest->affS
8030: 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  dst, 1);.       
8040: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
8050: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
8060: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
8070: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 1);.        s
8080: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8090: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
80a0: 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  , iParm, r1);.  
80b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
80c0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
80d0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  se, r1);.      }
80e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
80f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
8100: 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
8110: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
8120: 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
8130: 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
8140: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
8150: 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
8160: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8170: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
8180: 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   1, iParm);.    
8190: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
81a0: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
81b0: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
81c0: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
81d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
81e0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
81f0: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
8200: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
8210: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
8220: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
8230: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
8240: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
8250: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
8260: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
8270: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
8280: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
8290: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
82a0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
82b0: 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  tCol==1 );.     
82c0: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
82d0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
82e0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
82f0: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
8300: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20  , regResult, 1, 
8310: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
8320: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8330: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 65 73    assert( regRes
8340: 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20  ult==iParm );.  
8350: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
8360: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
8370: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
8380: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
8390: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
83a0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
83b0: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
83c0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
83d0: 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54  */..    case SRT
83e0: 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20  _Coroutine:     
83f0: 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74    /* Send data t
8400: 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  o a co-routine *
8410: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f  /.    case SRT_O
8420: 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20  utput: {        
8430: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  /* Return the re
8440: 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  sults */.      t
8450: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8460: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
8470: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8480: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8490: 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
84a0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
84b0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
84c0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
84d0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
84e0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
84f0: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
8500: 20 20 20 20 20 20 20 20 20 20 20 6e 50 72 65 66             nPref
8510: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
8520: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
8530: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
8540: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8550: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
8560: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
8570: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  DParm);.      }e
8580: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8590: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
85a0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
85b0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
85c0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
85d0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
85e0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
85f0: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
8600: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
8610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
8620: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
8630: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
8640: 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  TE.    /* Write 
8650: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  the results into
8660: 20 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75   a priority queu
8670: 65 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20  e that is order 
8680: 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20  according to.   
8690: 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65   ** pDest->pOrde
86a0: 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70  rBy (in pSO).  p
86b0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69  Dest->iSDParm (i
86c0: 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20  n iParm) is the 
86d0: 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20  cursor for an.  
86e0: 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
86f0: 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c  pSO->nExpr+2 col
8700: 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b  umns.  Build a k
8710: 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72  ey using pSO for
8720: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a   the first.    *
8730: 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c  * pSO->nExpr col
8740: 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20  umns, then make 
8750: 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72  sure all keys ar
8760: 65 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69  e unique by addi
8770: 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61  ng a.    ** fina
8780: 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f  l OP_Sequence co
8790: 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20  lumn.  The last 
87a0: 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65  column is the re
87b0: 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a  cord as a blob..
87c0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
87d0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20  SRT_DistQueue:. 
87e0: 20 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75     case SRT_Queu
87f0: 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  e: {.      int n
8800: 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  Key;.      int r
8810: 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20  1, r2, r3;.     
8820: 20 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20   int addrTest = 
8830: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  0;.      ExprLis
8840: 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53  t *pSO;.      pS
8850: 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65  O = pDest->pOrde
8860: 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  rBy;.      asser
8870: 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20  t( pSO );.      
8880: 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70  nKey = pSO->nExp
8890: 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  r;.      r1 = sq
88a0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
88b0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
88c0: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
88d0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
88e0: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72  nKey+2);.      r
88f0: 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20  3 = r2+nKey+1;. 
8900: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
8910: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
8920: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
8930: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
8940: 73 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65  s DistQueue, the
8950: 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b  n cursor (iParm+
8960: 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20  1) is open.     
8970: 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e     ** on a secon
8980: 64 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  d ephemeral inde
8990: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c  x that holds all
89a0: 20 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72   values every pr
89b0: 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20  eviously.       
89c0: 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65   ** added to the
89d0: 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20   queue. */.     
89e0: 20 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71     addrTest = sq
89f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
8a00: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
8a10: 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20  iParm+1, 0, .   
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a40: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20       regResult, 
8a50: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
8a60: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
8a70: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
8a80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8a90: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8aa0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
8ab0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
8ac0: 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  3);.      if( eD
8ad0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
8ae0: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ue ){.        sq
8af0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8b00: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
8b10: 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20   iParm+1, r3);. 
8b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8b30: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
8b40: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
8b50: 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LT);.      }.   
8b60: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b     for(i=0; i<nK
8b70: 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ey; i++){.      
8b80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8b90: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
8ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8bb0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8bc0: 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d  sult + pSO->a[i]
8bd0: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
8be0: 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20   - 1,.          
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c00: 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r2+i);.      }. 
8c10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8c20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
8c30: 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32  uence, iParm, r2
8c40: 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71  +nKey);.      sq
8c50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8c60: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
8c70: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31  , r2, nKey+2, r1
8c80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8c90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8ca0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
8cb0: 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66  m, r1);.      if
8cc0: 28 20 61 64 64 72 54 65 73 74 20 29 20 73 71 6c  ( addrTest ) sql
8cd0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
8ce0: 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20  (v, addrTest);. 
8cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
8d00: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
8d10: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  e, r1);.      sq
8d20: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8d30: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32  Range(pParse, r2
8d40: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
8d50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8d60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8d70: 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69  MIT_CTE */....#i
8d80: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8d90: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
8da0: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
8db0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
8dc0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
8dd0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
8de0: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
8df0: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
8e00: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
8e10: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
8e20: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
8e30: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
8e40: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
8e50: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
8e60: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
8e70: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
8e80: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
8e90: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
8ea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
8eb0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
8ec0: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
8ed0: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
8ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
8ef0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
8f00: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
8f10: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
8f20: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
8f30: 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  hed.  Except, if
8f40: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
8f50: 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63   sorter, in whic
8f60: 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65  h case the sorte
8f70: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69  r has already li
8f80: 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f  mited.  ** the o
8f90: 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20  utput for us..  
8fa0: 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  */.  if( pSort==
8fb0: 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29  0 && p->iLimit )
8fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
8fd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
8fe0: 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69  crJumpZero, p->i
8ff0: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
9000: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
9010: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
9020: 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  locate a KeyInfo
9030: 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69 65   object sufficie
9040: 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20  nt for an index 
9050: 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  of N key columns
9060: 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20   and.** X extra 
9070: 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49  columns..*/.KeyI
9080: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
9090: 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33  nfoAlloc(sqlite3
90a0: 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74   *db, int N, int
90b0: 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72   X){.  int nExtr
90c0: 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f  a = (N+X)*(sizeo
90d0: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 3b 0a  f(CollSeq*)+1);.
90e0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73    KeyInfo *p = s
90f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
9100: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 4b 65 79  w(db, sizeof(Key
9110: 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72 61 29 3b  Info) + nExtra);
9120: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
9130: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
9140: 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e  (u8*)&p->aColl[N
9150: 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65  +X];.    p->nFie
9160: 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20  ld = (u16)N;.   
9170: 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75   p->nXField = (u
9180: 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63  16)X;.    p->enc
9190: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
91a0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  p->db = db;.    
91b0: 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
91c0: 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20 30   memset(&p[1], 0
91d0: 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c  , nExtra);.  }el
91e0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  se{.    sqlite3O
91f0: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d  omFault(db);.  }
9200: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
9210: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
9220: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
9230: 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
9240: 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65  3KeyInfoUnref(Ke
9250: 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28  yInfo *p){.  if(
9260: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
9270: 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ( p->nRef>0 );. 
9280: 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20     p->nRef--;.  
9290: 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
92a0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
92b0: 28 70 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  (p->db, p);.  }.
92c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
92d0: 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  new pointer to a
92e0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
92f0: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
9300: 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65  te3KeyInfoRef(Ke
9310: 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28  yInfo *p){.  if(
9320: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
9330: 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ( p->nRef>0 );. 
9340: 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20     p->nRef++;.  
9350: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
9360: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9370: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
9380: 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79 49  n TRUE if a KeyI
9390: 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  nfo object can b
93a0: 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b  e change.  The K
93b0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  eyInfo object.**
93c0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61   can only be cha
93d0: 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73 20  nged if this is 
93e0: 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65  just a single re
93f0: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f  ference to the o
9400: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bject..**.** Thi
9410: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
9420: 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66  d only inside of
9430: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
9440: 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
9450: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
9460: 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a  teable(KeyInfo *
9470: 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52  p){ return p->nR
9480: 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20  ef==1; }.#endif 
9490: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
94a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
94b0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
94c0: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
94d0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
94e0: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
94f0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
9500: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
9510: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
9520: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
9530: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
9540: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
9550: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
9560: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
9570: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
9580: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
9590: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
95a0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
95b0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
95c0: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
95d0: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
95e0: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
95f0: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
9600: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
9610: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
9620: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
9630: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
9640: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
9650: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
9660: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
9670: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
9680: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
9690: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
96a0: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
96b0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
96c0: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
96d0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
96e0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
96f0: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
9700: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
9710: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
9720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
9730: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
9740: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
9750: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9760: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9770: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
9780: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
9790: 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66   Form the KeyInf
97a0: 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68  o object from th
97b0: 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20  is ExprList */. 
97c0: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20   int iStart,    
97d0: 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77        /* Begin w
97e0: 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  ith this column 
97f0: 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  of pList */.  in
9800: 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20  t nExtra        
9810: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
9820: 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  any extra column
9830: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a  s to the end */.
9840: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  ){.  int nExpr;.
9850: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
9860: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
9870: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
9880: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9890: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
98a0: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
98b0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
98c0: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
98d0: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
98e0: 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e   nExpr-iStart, n
98f0: 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20  Extra+1);.  if( 
9900: 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73  pInfo ){.    ass
9910: 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
9920: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
9930: 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72  Info) );.    for
9940: 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d  (i=iStart, pItem
9950: 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74  =pList->a+iStart
9960: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
9970: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
9980: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
9990: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
99a0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
99b0: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
99c0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
99d0: 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
99e0: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
99f0: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
9a00: 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d  Coll[i-iStart] =
9a10: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49   pColl;.      pI
9a20: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
9a30: 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65  i-iStart] = pIte
9a40: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
9a50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9a60: 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pInfo;.}../*.**
9a70: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
9a80: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
9a90: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
9aa0: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
9ab0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9ac0: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
9ad0: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
9ae0: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
9af0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
9b00: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
9b10: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
9b20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
9b30: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
9b40: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
9b50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9b60: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
9b70: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
9b80: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
9b90: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
9ba0: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
9bb0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
9bc0: 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
9bd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
9be0: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  LAIN./*.** Unles
9bf0: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
9c00: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
9c10: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
9c20: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9c30: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9c40: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9c50: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9c60: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
9c70: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
9c80: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
9c90: 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  tion is of the f
9ca0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53  orm:.**.**   "US
9cb0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
9cc0: 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65  R xxx".**.** whe
9cd0: 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66  re xxx is one of
9ce0: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52   "DISTINCT", "OR
9cf0: 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55  DER BY" or "GROU
9d00: 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77  P BY". Exactly w
9d10: 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72  hich.** is deter
9d20: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73  mined by the zUs
9d30: 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  age argument..*/
9d40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9d50: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61  lainTempTable(Pa
9d60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
9d70: 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29  st char *zUsage)
9d80: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
9d90: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
9da0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9db0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
9dc0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
9dd0: 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
9de0: 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50  e->db, "USE TEMP
9df0: 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c   B-TREE FOR %s",
9e00: 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71   zUsage);.    sq
9e10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
9e20: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
9e30: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
9e40: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
9e50: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
9e60: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65  ../*.** Assign e
9e70: 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c  xpression b to l
9e80: 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e  value a. A secon
9e90: 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f  d, no-op, versio
9ea0: 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a  n of this macro.
9eb0: 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77  ** is provided w
9ec0: 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  hen SQLITE_OMIT_
9ed0: 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e  EXPLAIN is defin
9ee0: 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ed. This allows 
9ef0: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73  the code.** in s
9f00: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74  qlite3Select() t
9f10: 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20  o assign values 
9f20: 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d  to structure mem
9f30: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  ber variables th
9f40: 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74  at.** only exist
9f50: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
9f60: 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64  EXPLAIN is not d
9f70: 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70  efined without p
9f80: 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20  olluting the.** 
9f90: 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65  code with #ifnde
9fa0: 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f  f directives..*/
9fb0: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
9fc0: 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62  nSetInteger(a, b
9fd0: 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f  ) a = b..#else./
9fe0: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
9ff0: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
a000: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
a010: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
a020: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65  define explainTe
a030: 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64  mpTable(y,z).# d
a040: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
a050: 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e  Integer(y,z).#en
a060: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
a070: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
a080: 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e  PLAIN) && !defin
a090: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
a0a0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a  OMPOUND_SELECT).
a0b0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
a0c0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
a0d0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
a0e0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
a0f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
a100: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
a110: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
a120: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
a130: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
a140: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
a150: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
a160: 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
a170: 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a   two forms:.**.*
a180: 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53  *   "COMPOSITE S
a190: 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20  UBQUERIES iSub1 
a1a0: 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a  and iSub2 (op)".
a1b0: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
a1c0: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
a1d0: 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47   and iSub2 USING
a1e0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70   TEMP B-TREE (op
a1f0: 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69  )".**.** where i
a200: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 61  Sub1 and iSub2 a
a210: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20  re the integers 
a220: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f  passed as the co
a230: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66  rresponding.** f
a240: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
a250: 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68  rs, and op is th
a260: 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74  e text represent
a270: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
a280: 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
a290: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20   same name. The 
a2a0: 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d  parameter "op" m
a2b0: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b  ust be one of TK
a2c0: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
a2d0: 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45  T,.** TK_INTERSE
a2e0: 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68  CT or TK_ALL. Th
a2f0: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20  e first form is 
a300: 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74  used if argument
a310: 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20   bUseTmp is .** 
a320: 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65  false, or the se
a330: 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20  cond form if it 
a340: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
a350: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43  ic void explainC
a360: 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73  omposite(.  Pars
a370: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a390: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
a3a0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3c0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
a3d0: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20  NION, TK_EXCEPT 
a3e0: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  etc. */.  int iS
a3f0: 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub1,            
a400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
a410: 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20  query id 1 */.  
a420: 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20 20  int iSub2,      
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 32  /* Subquery id 2
a450: 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d   */.  int bUseTm
a460: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
a470: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
a480: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61   a temp table wa
a490: 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  s used */.){.  a
a4a0: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e  ssert( op==TK_UN
a4b0: 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58  ION || op==TK_EX
a4c0: 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
a4d0: 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d  NTERSECT || op==
a4e0: 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20  TK_ALL );.  if( 
a4f0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
a500: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
a510: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a520: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
a530: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
a540: 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  tf(.        pPar
a550: 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e  se->db, "COMPOUN
a560: 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64 20  D SUBQUERIES %d 
a570: 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c 20  AND %d %s(%s)", 
a580: 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20  iSub1, iSub2,.  
a590: 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55        bUseTmp?"U
a5a0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
a5b0: 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e   ":"", selectOpN
a5c0: 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20  ame(op).    );. 
a5d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a5e0: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
a5f0: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
a600: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
a610: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
a620: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e    }.}.#else./* N
a630: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
a640: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
a650: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
a660: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
a670: 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ine explainCompo
a680: 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a  site(v,w,x,y,z).
a690: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
a6a0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
a6b0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
a6c0: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
a6d0: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
a6e0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
a6f0: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
a700: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
a710: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
a720: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
a730: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
a740: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
a750: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
a760: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
a770: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
a780: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
a790: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
a7a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a7b0: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
a7c0: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
a7d0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a7e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
a7f0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
a800: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
a810: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f  tatement */.  So
a820: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
a830: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  /* Information o
a840: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
a850: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
a860: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20  Column,      /* 
a870: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
a880: 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53  s of data */.  S
a890: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
a8a0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
a8b0: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
a8c0: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
a8d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a8e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a8f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
a900: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a910: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
a920: 65 61 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c 61 62  eak = pSort->lab
a930: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  elDone;         
a940: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
a950: 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a  to exit loop */.
a960: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e    int addrContin
a970: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
a980: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
a990: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
a9a0: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
a9b0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
a9c0: 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20  addrOnce = 0;.  
a9d0: 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72  int iTab;.  Expr
a9e0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
a9f0: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
aa00: 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ;.  int eDest = 
aa10: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
aa20: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
aa30: 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e  t->iSDParm;.  in
aa40: 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20  t regRow;.  int 
aa50: 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20  regRowid;.  int 
aa60: 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72  nKey;.  int iSor
aa70: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
aa80: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
aa90: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
aaa0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
aab0: 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20  SortData;       
aac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
aad0: 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  ailing values to
aae0: 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65   read from sorte
aaf0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  r */.  int i;.  
ab00: 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20  int bSeq;       
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65  /* True if sorte
ab30: 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65  r record include
ab40: 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69  s seq. no. */.#i
ab50: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ab60: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
ab70: 4e 54 53 0a 20 20 73 74 72 75 63 74 20 45 78 70  NTS.  struct Exp
ab80: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74  rList_item *aOut
ab90: 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Ex = p->pEList->
aba0: 61 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  a;.#endif..  ass
abb0: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
abc0: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
abd0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
abe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
abf0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
ac00: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
ac10: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
ac20: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
ac30: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
ac40: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
ac50: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
ac60: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
ac70: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
ac80: 7d 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74  }.  iTab = pSort
ac90: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66  ->iECursor;.  if
aca0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
acb0: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
acc0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
acd0: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b     regRowid = 0;
ace0: 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44  .    regRow = pD
acf0: 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 20 20  est->iSdst;.    
ad00: 6e 53 6f 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c  nSortData = nCol
ad10: 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  umn;.  }else{.  
ad20: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c    regRowid = sql
ad30: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
ad40: 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 67 52  Parse);.    regR
ad50: 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ow = sqlite3GetT
ad60: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
ad70: 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20      nSortData = 
ad80: 31 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20  1;.  }.  nKey = 
ad90: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
ada0: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  - pSort->nOBSat;
adb0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
adc0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
add0: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
ade0: 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f      int regSortO
adf0: 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ut = ++pParse->n
ae00: 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61  Mem;.    iSortTa
ae10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
ae20: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72  ++;.    if( pSor
ae30: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b  t->labelBkOut ){
ae40: 0a 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20  .      addrOnce 
ae50: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
ae60: 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
ae70: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
ae80: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
ae90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
aea0: 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74 54  enPseudo, iSortT
aeb0: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
aec0: 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61  nKey+1+nSortData
aed0: 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f  );.    if( addrO
aee0: 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62  nce ) sqlite3Vdb
aef0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
af00: 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72  rOnce);.    addr
af10: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
af20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
af30: 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c  orterSort, iTab,
af40: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
af50: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
af60: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
af70: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
af80: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
af90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
afa0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
afb0: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
afc0: 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54 61  SortOut, iSortTa
afd0: 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30  b);.    bSeq = 0
afe0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
aff0: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
b000: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b010: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  P_Sort, iTab, ad
b020: 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
b030: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63  verage(v);.    c
b040: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
b050: 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  iOffset, addrCon
b060: 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72  tinue);.    iSor
b070: 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  tTab = iTab;.   
b080: 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20   bSeq = 1;.  }. 
b090: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 6f 72   for(i=0; i<nSor
b0a0: 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20 20  tData; i++){.   
b0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b0c0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
b0d0: 20 69 53 6f 72 74 54 61 62 2c 20 6e 4b 65 79 2b   iSortTab, nKey+
b0e0: 62 53 65 71 2b 69 2c 20 72 65 67 52 6f 77 2b 69  bSeq+i, regRow+i
b0f0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
b100: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f 75  nt((v, "%s", aOu
b110: 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61  tEx[i].zName ? a
b120: 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a  OutEx[i].zName :
b130: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e   aOutEx[i].zSpan
b140: 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  ));.  }.  switch
b150: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
b160: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
b170: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b180: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b190: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
b1a0: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
b1b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b1c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
b1d0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
b1e0: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
b1f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
b200: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
b210: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
b220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
b230: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b240: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
b250: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
b260: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
b270: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
b280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b290: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
b2a0: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20  ord, regRow, 1, 
b2b0: 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  regRowid,.      
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73    &pDest->affSds
b2e0: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
b2f0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
b300: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
b310: 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a  se, regRow, 1);.
b320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b330: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
b340: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
b350: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
b360: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b370: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
b380: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b390: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
b3a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b3b0: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
b3c0: 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31  regRow, iParm, 1
b3d0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
b3e0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
b3f0: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
b400: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
b410: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b420: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
b430: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
b440: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
b450: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
b460: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
b470: 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61  ); .      testca
b480: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
b490: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74  utput );.      t
b4a0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
b4b0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
b4c0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
b4d0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
b4e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b4f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b500: 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74  ResultRow, pDest
b510: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
b520: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b530: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
b540: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
b550: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
b560: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
b570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b590: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
b5a0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
b5b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
b5c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
b5d0: 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b 0a  if( regRowid ){.
b5e0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
b5f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
b600: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 73  , regRow);.    s
b610: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b620: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
b630: 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Rowid);.  }.  /*
b640: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
b650: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
b660: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
b670: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
b680: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
b690: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
b6a0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
b6b0: 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rter ){.    sqli
b6c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b6d0: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
b6e0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
b6f0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b700: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
b710: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b720: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
b730: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
b740: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
b750: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
b760: 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  n ) sqlite3VdbeA
b770: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
b780: 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  rn, pSort->regRe
b790: 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  turn);.  sqlite3
b7a0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b7b0: 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
b7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b7d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
b7e0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
b7f0: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
b800: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
b810: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
b820: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
b830: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
b840: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
b850: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  aller..**.** Als
b860: 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
b870: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
b880: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
b890: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
b8a0: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70  .** result in *p
b8b0: 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20  EstWidth..**.** 
b8c0: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
b8d0: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
b8e0: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
b8f0: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
b900: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
b910: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
b920: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
b930: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b940: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
b950: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
b960: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
b970: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
b980: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
b990: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
b9a0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
b9b0: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
b9c0: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
b9d0: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
b9e0: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
b9f0: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
ba00: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
ba10: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
ba20: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
ba30: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
ba40: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
ba50: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
ba60: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
ba70: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
ba80: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
ba90: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
baa0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
bab0: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
bac0: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
bad0: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
bae0: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
baf0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
bb00: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
bb10: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
bb20: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
bb30: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
bb40: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
bb50: 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61  either 3 or 6 pa
bb60: 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69  rameters dependi
bb70: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
bb80: 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49   not.** the SQLI
bb90: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
bba0: 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c  _METADATA compil
bbb0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
bbc0: 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66   used..*/.#ifdef
bbd0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
bbe0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23  OLUMN_METADATA.#
bbf0: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
bc00: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
bc10: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
bc20: 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 23 65 6c 73  ,B,C,D,E,F).#els
bc30: 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64  e /* if !defined
bc40: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
bc50: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
bc60: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  */.# define colu
bc70: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
bc80: 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,F) columnTypeIm
bc90: 70 6c 28 41 2c 42 2c 46 29 0a 23 65 6e 64 69 66  pl(A,B,F).#endif
bca0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
bcb0: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ar *columnTypeIm
bcc0: 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pl(.  NameContex
bcd0: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
bce0: 2a 70 45 78 70 72 2c 0a 23 69 66 64 65 66 20 53  *pExpr,.#ifdef S
bcf0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
bd00: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63  UMN_METADATA.  c
bd10: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
bd20: 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  igDb,.  const ch
bd30: 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a  ar **pzOrigTab,.
bd40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
bd50: 7a 4f 72 69 67 43 6f 6c 2c 0a 23 65 6e 64 69 66  zOrigCol,.#endif
bd60: 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68  .  u8 *pEstWidth
bd70: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
bd80: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
bd90: 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69  nt j;.  u8 estWi
bda0: 64 74 68 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  dth = 1;.#ifdef 
bdb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
bdc0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
bdd0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
bde0: 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  gDb = 0;.  char 
bdf0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20  const *zOrigTab 
be00: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
be10: 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  t *zOrigCol = 0;
be20: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
be30: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
be40: 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
be50: 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
be60: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
be70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
be80: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
be90: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
bea0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
beb0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
bec0: 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68  olumn. Locate th
bed0: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75  e table the colu
bee0: 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  mn is being.    
bef0: 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66    ** extracted f
bf00: 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65  rom in NameConte
bf10: 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69  xt.pSrcList. Thi
bf20: 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72  s table may be r
bf30: 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  eal.      ** dat
bf40: 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
bf50: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20   subquery..     
bf60: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
bf70: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *pTab = 0;      
bf80: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73        /* Table s
bf90: 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20  tructure column 
bfa0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
bfb0: 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  m */.      Selec
bfc0: 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20  t *pS = 0;      
bfd0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
bfe0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65   the column is e
bff0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
c000: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
c010: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
c020: 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ;  /* Index of c
c030: 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f  olumn in pTab */
c040: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
c050: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
c060: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
c070: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
c080: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
c090: 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  N );.      while
c0a0: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
c0b0: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
c0c0: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
c0d0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
c0e0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
c0f0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
c100: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
c110: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
c120: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
c130: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
c140: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
c150: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
c160: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
c170: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20  b;.          pS 
c180: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
c190: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
c1a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c1b0: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
c1c0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
c1d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
c1e0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
c1f0: 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74       /* At one t
c200: 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61  ime, code such a
c210: 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22  s "SELECT new.x"
c220: 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
c230: 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  r would.        
c240: 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63 6f  ** cause this co
c250: 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20  ndition to run. 
c260: 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20   Since then, we 
c270: 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72 65  have restructure
c280: 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  d how.        **
c290: 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69 73   trigger code is
c2a0: 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73   generated and s
c2b0: 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  o this condition
c2c0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20   is no longer . 
c2d0: 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
c2e0: 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20  le. However, it 
c2f0: 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75  can still be tru
c300: 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73  e for statements
c310: 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a   like.        **
c320: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c330: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c340: 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
c350: 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45  ABLE t1(col INTE
c360: 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a  GER);.        **
c370: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
c380: 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46  T t1.col) FROM F
c390: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20  ROM t1;.        
c3a0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
c3b0: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
c3c0: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
c3d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e   expression "t1.
c3e0: 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20  col" in the .   
c3f0: 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65       ** sub-sele
c400: 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ct. In this case
c410: 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  , set the column
c420: 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65   type to NULL, e
c430: 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ven.        ** t
c440: 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20  hough it should 
c450: 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47  really be "INTEG
c460: 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ER"..        **.
c470: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
c480: 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
c490: 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  , as the column 
c4a0: 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22  type of "t1.col"
c4b0: 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20   is never.      
c4c0: 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20    ** used. When 
c4d0: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
c4e0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
c4f0: 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20  pression .      
c500: 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31    ** "(SELECT t1
c510: 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72  .col)", the corr
c520: 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74 75  ect type is retu
c530: 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54 4b  rned (see the TK
c540: 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20  _SELECT.        
c550: 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e  ** branch below.
c560: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65    */.        bre
c570: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
c580: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20     assert( pTab 
c590: 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d  && pExpr->pTab==
c5a0: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
c5b0: 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pS ){.        
c5c0: 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69  /* The "table" i
c5d0: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62  s actually a sub
c5e0: 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65  -select or a vie
c5f0: 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  w in the FROM cl
c600: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
c610: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
c620: 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  atement. Return 
c630: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c640: 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a  type and origin.
c650: 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
c660: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73  for the result-s
c670: 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  et column of the
c680: 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20   sub-select..   
c690: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c6a0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41  if( iCol>=0 && A
c6b0: 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70  LWAYS(iCol<pS->p
c6c0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
c6d0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
c6e0: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
c6f0: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
c700: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71  e expression req
c710: 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20  uests the.      
c720: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20      ** rowid of 
c730: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  the sub-select o
c740: 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70  r view. This exp
c750: 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c  ression is legal
c760: 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20   (see .         
c770: 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69   ** test case mi
c780: 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c  sc2.2.2) - it al
c790: 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74  ways evaluates t
c7a0: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
c7b0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
c7c0: 2a 20 54 68 65 20 41 4c 57 41 59 53 28 29 20 69  * The ALWAYS() i
c7d0: 73 20 62 65 63 61 75 73 65 20 69 43 6f 6c 3e 3d  s because iCol>=
c7e0: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
c7f0: 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  r will have been
c800: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
c810: 75 67 68 74 20 61 6c 72 65 61 64 79 20 62 79 20  ught already by 
c820: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
c830: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
c840: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
c850: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
c860: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
c870: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
c880: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
c890: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
c8a0: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
c8b0: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
c8c0: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pNC;.          
c8d0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
c8e0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
c8f0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
c900: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26  mnType(&sNC, p,&
c910: 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61  zOrigDb,&zOrigTa
c920: 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73  b,&zOrigCol, &es
c930: 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20  tWidth); .      
c940: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
c950: 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  if( pTab->pSchem
c960: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
c970: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
c980: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c990: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
c9a0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
c9b0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
c9c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c9d0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
c9e0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
c9f0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64  b->nCol) );.#ifd
ca00: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ca10: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
ca20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
ca30: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
ca40: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
ca50: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
ca60: 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22  rigCol = "rowid"
ca70: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ca80: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
ca90: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
caa0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
cab0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
cac0: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
cad0: 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e(&pTab->aCol[iC
cae0: 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ol],0);.        
caf0: 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61    estWidth = pTa
cb00: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a  b->aCol[iCol].sz
cb10: 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Est;.        }. 
cb20: 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20         zOrigTab 
cb30: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
cb40: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
cb50: 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20  pParse ){.      
cb60: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
cb70: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
cb80: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
cb90: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
cba0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
cbb0: 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  rigDb = pNC->pPa
cbc0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
cbd0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
cbe0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
cbf0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
cc00: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
cc10: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
cc20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cc30: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c       zType = sql
cc40: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26  ite3ColumnType(&
cc50: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cc60: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  ,0);.          e
cc70: 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e  stWidth = pTab->
cc80: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74  aCol[iCol].szEst
cc90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
cca0: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
ccb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
ccc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ccd0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
cce0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
ccf0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
cd00: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
cd10: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
cd20: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
cd30: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
cd40: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
cd50: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
cd60: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
cd70: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
cd80: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
cd90: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
cda0: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
cdb0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
cdc0: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
cdd0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
cde0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
cdf0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
ce00: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
ce10: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
ce20: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
ce30: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
ce40: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
ce50: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
ce60: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
ce70: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
ce80: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
ce90: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
cea0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
ceb0: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
cec0: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
ced0: 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20  ol, &estWidth); 
cee0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cef0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
cf00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cf10: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
cf20: 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f  DATA  .  if( pzO
cf30: 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73  rigDb ){.    ass
cf40: 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26  ert( pzOrigTab &
cf50: 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20  & pzOrigCol );. 
cf60: 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a     *pzOrigDb = z
cf70: 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f  OrigDb;.    *pzO
cf80: 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61  rigTab = zOrigTa
cf90: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f  b;.    *pzOrigCo
cfa0: 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20  l = zOrigCol;.  
cfb0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
cfc0: 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73 74  EstWidth ) *pEst
cfd0: 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74 68  Width = estWidth
cfe0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65  ;.  return zType
cff0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
d000: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
d010: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
d020: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
d030: 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   types of column
d040: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
d050: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
d060: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
d070: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
d080: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d090: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
d0a0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
d0b0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
d0c0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
d0d0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
d0e0: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
d0f0: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
d100: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
d110: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
d120: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
d130: 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  E.  Vdbe *v = pP
d140: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
d150: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
d160: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
d170: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
d180: 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  st;.  sNC.pParse
d190: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72   = pParse;.  for
d1a0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
d1b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d1c0: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
d1d0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
d1e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d1f0: 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Type;.#ifdef SQL
d200: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
d210: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63  N_METADATA.    c
d220: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
d230: 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  Db = 0;.    cons
d240: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62  t char *zOrigTab
d250: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
d260: 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  char *zOrigCol =
d270: 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   0;.    zType = 
d280: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
d290: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
d2a0: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
d2b0: 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  ol, 0);..    /* 
d2c0: 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61  The vdbe must ma
d2d0: 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  ke its own copy 
d2e0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
d2f0: 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20  pe and other .  
d300: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63    ** column spec
d310: 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e  ific strings, in
d320: 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61   case the schema
d330: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
d340: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72   this.    ** vir
d350: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20  tual machine is 
d360: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
d370: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d380: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d390: 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45  COLNAME_DATABASE
d3a0: 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54  , zOrigDb, SQLIT
d3b0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
d3c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d3d0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d3e0: 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72  LNAME_TABLE, zOr
d3f0: 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52  igTab, SQLITE_TR
d400: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
d410: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d420: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d430: 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43  E_COLUMN, zOrigC
d440: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
d450: 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20  IENT);.#else.   
d460: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
d470: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
d480: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
d490: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d4a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d4b0: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
d4c0: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
d4d0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
d4e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
d4f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d500: 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a  DECLTYPE) */.}..
d510: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d520: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
d530: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
d540: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
d550: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
d560: 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66  t set.  This inf
d570: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
d580: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a   to provide the.
d590: 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65  ** azCol[] value
d5a0: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
d5b0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
d5c0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
d5d0: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
d5e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
d5f0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
d600: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
d610: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
d620: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
d630: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
d640: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d650: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
d660: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
d670: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
d680: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
d690: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
d6a0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d6b0: 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d  b;.  int fullNam
d6c0: 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a  es, shortNames;.
d6d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d6e0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
d6f0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
d700: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
d710: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
d720: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
d730: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
d740: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
d750: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
d760: 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e 6d 61 6c  esSet || db->mal
d770: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
d780: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  rn;.  assert( v!
d790: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d7a0: 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pTabList!=0 );. 
d7b0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
d7c0: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
d7d0: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
d7e0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
d7f0: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
d800: 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62  shortNames = (db
d810: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
d820: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
d830: 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  =0;.  sqlite3Vdb
d840: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
d850: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
d860: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
d870: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
d880: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
d890: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
d8a0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
d8b0: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
d8c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
d8d0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
d8e0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
d8f0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
d900: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
d910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d920: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d930: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d940: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52  zName, SQLITE_TR
d950: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
d960: 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
d970: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f  K_COLUMN || p->o
d980: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
d990: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
d9a0: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
d9b0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
d9c0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
d9d0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
d9e0: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
d9f0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
da00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
da10: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
da20: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
da30: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
da40: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
da50: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
da60: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
da70: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
da80: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
da90: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
daa0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
dab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
dac0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
dad0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
dae0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
daf0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
db00: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
db10: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
db20: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
db30: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
db40: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
db50: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
db60: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
db70: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
db80: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
db90: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
dba0: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
dbb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
dbc0: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
dbd0: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
dbe0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
dbf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
dc00: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
dc10: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
dc20: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
dc30: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
dc40: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
dc50: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
dc60: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
dc70: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
dc80: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
dc90: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
dca0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
dcb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
dcc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dcd0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
dce0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
dcf0: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
dd00: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
dd10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dd20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
dd30: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
dd40: 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20  Span;.      z = 
dd50: 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50  z==0 ? sqlite3MP
dd60: 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d  rintf(db, "colum
dd70: 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c  n%d", i+1) : sql
dd80: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
dd90: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
dda0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
ddb0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
ddc0: 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44  AME, z, SQLITE_D
ddd0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
dde0: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
ddf0: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
de00: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
de10: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t);.}../*.** Giv
de20: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
de30: 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20   list (which is 
de40: 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20  really the list 
de50: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  of expressions.*
de60: 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  * that form the 
de70: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
de80: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
de90: 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70  ) compute approp
dea0: 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
deb0: 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c  names for a tabl
dec0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c  e that would hol
ded0: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
dee0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   list..**.** All
def0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69   column names wi
df00: 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a  ll be unique..**
df10: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c  .** Only the col
df20: 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f  umn names are co
df30: 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e  mputed.  Column.
df40: 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43  zType, Column.zC
df50: 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  oll,.** and othe
df60: 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75  r fields of Colu
df70: 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  mn are zeroed..*
df80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
df90: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
dfa0: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
dfb0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
dfc0: 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65  occurs,.** store
dfd0: 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20   NULL in *paCol 
dfe0: 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20  and 0 in *pnCol 
dff0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
e000: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20  E_NOMEM..*/.int 
e010: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
e020: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
e030: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e040: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
e050: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
e060: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
e070: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
e080: 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
e090: 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
e0a0: 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
e0b0: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
e0c0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
e0d0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
e0e0: 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
e0f0: 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
e100: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
e110: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
e120: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
e130: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e140: 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
e150: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
e160: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
e190: 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20  s */.  u32 cnt; 
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
e1c0: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
e1d0: 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
e1e0: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
e1f0: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
e200: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
e210: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
e220: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e240: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
e250: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
e260: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
e270: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
e280: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
e290: 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c  sion for a singl
e2a0: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
e2b0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
e2c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e2d0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
e2e0: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
e310: 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20   in zName[] */. 
e320: 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20 20   Hash ht;       
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e340: 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f  Hash table of co
e350: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20  lumn names */.. 
e360: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
e370: 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45 4c  (&ht);.  if( pEL
e380: 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20  ist ){.    nCol 
e390: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
e3a0: 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69  .    aCol = sqli
e3b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
e3c0: 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b  db, sizeof(aCol[
e3d0: 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74  0])*nCol);.    t
e3e0: 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30  estcase( aCol==0
e3f0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
e400: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61   nCol = 0;.    a
e410: 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Col = 0;.  }.  a
e420: 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31  ssert( nCol==(i1
e430: 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43  6)nCol );.  *pnC
e440: 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61  ol = nCol;.  *pa
e450: 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66  Col = aCol;..  f
e460: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
e470: 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62  l; i<nCol && !db
e480: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20  ->mallocFailed; 
e490: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
e4a0: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
e4b0: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
e4c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
e4d0: 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  */.    p = sqlit
e4e0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
e4f0: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e(pEList->a[i].p
e500: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28  Expr);.    if( (
e510: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
e520: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
e530: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
e540: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
e550: 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
e560: 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
e570: 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
e580: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
e590: 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78      Expr *pColEx
e5a0: 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20  pr = p;  /* The 
e5b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
e5c0: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  is the result co
e5d0: 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
e5e0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
e5f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
e600: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
e610: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
e620: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
e630: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
e640: 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
e650: 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c   pColExpr = pCol
e660: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
e670: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
e680: 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  olExpr!=0 );.   
e690: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
e6a0: 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
e6b0: 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53  COLUMN && ALWAYS
e6c0: 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21  (pColExpr->pTab!
e6d0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
e6e0: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73  * For columns us
e6f0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
e700: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
e710: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f    int iCol = pCo
e720: 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  lExpr->iColumn;.
e730: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
e740: 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  ColExpr->pTab;. 
e750: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
e760: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
e770: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
e780: 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20  zName = iCol>=0 
e790: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
e7a0: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
e7b0: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  d";.      }else 
e7c0: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
e7d0: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
e7e0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
e7f0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c  HasProperty(pCol
e800: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
e810: 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e  e) );.        zN
e820: 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  ame = pColExpr->
e830: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
e840: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
e850: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
e860: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
e870: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
e880: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
e890: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
e8a0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
e8b0: 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  an;.      }.    
e8c0: 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  }.    zName = sq
e8d0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
e8e0: 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 0a   "%s", zName);..
e8f0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
e900: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
e910: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
e920: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
e930: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
e940: 70 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72  ppend an integer
e950: 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20   to the name so 
e960: 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20  that it becomes 
e970: 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20  unique..    */. 
e980: 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
e990: 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20  while( zName && 
e9a0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
e9b0: 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29  &ht, zName)!=0 )
e9c0: 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  {.      nName = 
e9d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e9e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
e9f0: 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20  ( nName>0 ){.   
ea00: 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65       for(j=nName
ea10: 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74  -1; j>0 && sqlit
ea20: 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b  e3Isdigit(zName[
ea30: 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20  j]); j--){}.    
ea40: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d      if( zName[j]
ea50: 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20  ==':' ) nName = 
ea60: 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  j;.      }.     
ea70: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
ea80: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a  MPrintf(db, "%.*
ea90: 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e  z:%u", nName, zN
eaa0: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
eab0: 20 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73     if( cnt>3 ) s
eac0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
ead0: 73 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26  s(sizeof(cnt), &
eae0: 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  cnt);.    }.    
eaf0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  pCol->zName = zN
eb00: 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ame;.    sqlite3
eb10: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
eb20: 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c  FromName(0, pCol
eb30: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
eb40: 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49   && sqlite3HashI
eb50: 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65  nsert(&ht, zName
eb60: 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b  , pCol)==pCol ){
eb70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
eb80: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
eb90: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  }.  }.  sqlite3H
eba0: 61 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20  ashClear(&ht);. 
ebb0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
ebc0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
ebd0: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
ebe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
ebf0: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
ec00: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
ec10: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ec20: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
ec30: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
ec40: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
ec50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ec60: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
ec70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ec80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
ec90: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
eca0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
ecb0: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
ecc0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
ecd0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
ece0: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
ecf0: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
ed00: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
ed10: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
ed20: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
ed30: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
ed40: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
ed50: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
ed60: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
ed70: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
ed80: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
ed90: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
eda0: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
edb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
edc0: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
edd0: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
ede0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
edf0: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
ee00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ee10: 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
ee20: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
ee30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ee40: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
ee50: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
ee60: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
ee70: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
ee80: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
ee90: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
eea0: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
eeb0: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
eec0: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
eed0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
eee0: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
eef0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
ef00: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
ef10: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
ef20: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
ef30: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
ef40: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
ef50: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
ef60: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
ef70: 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a  tem *a;.  u64 sz
ef80: 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  All = 0;..  asse
ef90: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
efa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
efb0: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
efc0: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
efd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
efe0: 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
eff0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
f000: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
f010: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
f020: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f030: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
f040: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
f050: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
f060: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
f070: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
f080: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
f090: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
f0a0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
f0b0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
f0c0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63  , pCol++){.    c
f0d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
f0e0: 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a  ;.    int n, m;.
f0f0: 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78      p = a[i].pEx
f100: 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  pr;.    zType = 
f110: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
f120: 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 43   p, 0, 0, 0, &pC
f130: 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20 20 20 20  ol->szEst);.    
f140: 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73  szAll += pCol->s
f150: 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  zEst;.    pCol->
f160: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
f170: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
f180: 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65  );.    if( zType
f190: 20 26 26 20 28 6d 20 3d 20 73 71 6c 69 74 65 33   && (m = sqlite3
f1a0: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 29  Strlen30(zType))
f1b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  >0 ){.      n = 
f1c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
f1d0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
f1e0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
f1f0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
f200: 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f  ocOrFree(db, pCo
f210: 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29  l->zName, n+m+2)
f220: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  ;.      if( pCol
f230: 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
f240: 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d     memcpy(&pCol-
f250: 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79  >zName[n+1], zTy
f260: 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20  pe, m+1);.      
f270: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
f280: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54   |= COLFLAG_HAST
f290: 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  YPE;.      }.   
f2a0: 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d   }.    if( pCol-
f2b0: 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70  >affinity==0 ) p
f2c0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
f2d0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
f2e0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
f2f0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
f300: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
f310: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
f320: 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20  l->zColl==0 ){. 
f330: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c       pCol->zColl
f340: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
f350: 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  up(db, pColl->zN
f360: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
f370: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
f380: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
f390: 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a  (szAll*4);.}../*
f3a0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
f3b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
f3c0: 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
f3d0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
f3e0: 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
f3f0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
f400: 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
f410: 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
f420: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
f430: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
f440: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
f450: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
f460: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
f470: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73  rse->db;.  int s
f480: 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61  avedFlags;..  sa
f490: 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  vedFlags = db->f
f4a0: 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  lags;.  db->flag
f4b0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c  s &= ~SQLITE_Ful
f4c0: 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d  lColNames;.  db-
f4d0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
f4e0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a  _ShortColNames;.
f4f0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
f500: 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c  rep(pParse, pSel
f510: 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
f520: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
f530: 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
f540: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
f550: 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
f560: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
f570: 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65  db->flags = save
f580: 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d  dFlags;.  pTab =
f590: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
f5a0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
f5b0: 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
f5c0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
f5d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
f5e0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73  * The sqlite3Res
f5f0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
f600: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20   is only used n 
f610: 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c  contexts where l
f620: 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73  ookaside.  ** is
f630: 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
f640: 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
f650: 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b  side.bDisable );
f660: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
f670: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
f680: 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
f690: 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
f6a0: 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
f6b0: 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
f6c0: 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  76) );.  sqlite3
f6d0: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
f6e0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
f6f0: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
f700: 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
f710: 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
f720: 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
f730: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
f740: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
f750: 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d  Select);.  pTab-
f760: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69  >iPKey = -1;.  i
f770: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f780: 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
f790: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
f7a0: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74  , pTab);.    ret
f7b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
f7c0: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
f7d0: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
f7e0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
f7f0: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
f800: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
f810: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
f820: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
f830: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
f840: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
f850: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
f860: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
f870: 4f 49 4e 4c 49 4e 45 20 56 64 62 65 20 2a 61 6c  OINLINE Vdbe *al
f880: 6c 6f 63 56 64 62 65 28 50 61 72 73 65 20 2a 70  locVdbe(Parse *p
f890: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
f8a0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f8b0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
f8c0: 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 20  reate(pParse);. 
f8d0: 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33   if( v ) sqlite3
f8e0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
f8f0: 5f 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 70 50  _Init);.  if( pP
f900: 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d  arse->pToplevel=
f910: 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
f920: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
f930: 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46  rse->db,SQLITE_F
f940: 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20  actorOutConst). 
f950: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
f960: 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20  okConstFactor = 
f970: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
f980: 76 3b 0a 7d 0a 56 64 62 65 20 2a 73 71 6c 69 74  v;.}.Vdbe *sqlit
f990: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
f9a0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
f9b0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f9c0: 64 62 65 3b 0a 20 20 72 65 74 75 72 6e 20 76 20  dbe;.  return v 
f9d0: 3f 20 76 20 3a 20 61 6c 6c 6f 63 56 64 62 65 28  ? v : allocVdbe(
f9e0: 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pParse);.}.../*.
f9f0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
fa00: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
fa10: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
fa20: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
fa30: 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
fa40: 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
fa50: 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
fa60: 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
fa70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
fa80: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
fa90: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
faa0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
fab0: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
fac0: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
fad0: 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
fae0: 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
faf0: 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
fb00: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
fb10: 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
fb20: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
fb30: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
fb40: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
fb50: 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
fb60: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
fb70: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
fb80: 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
fb90: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
fba0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
fbb0: 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
fbc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
fbd0: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
fbe0: 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
fbf0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
fc00: 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
fc10: 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
fc20: 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
fc30: 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
fc40: 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
fc50: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
fc60: 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
fc70: 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
fc80: 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29  lt values (zero)
fc90: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
fca0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
fcb0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66  e..**.** The iOf
fcc0: 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28 69  fset register (i
fcd0: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
fce0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
fcf0: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
fd00: 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20  he OFFSET.  The 
fd10: 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20  iLimit register 
fd20: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
fd30: 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74  o LIMIT.  Regist
fd40: 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20  er.** iOffset+1 
fd50: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
fd60: 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a  o LIMIT+OFFSET..
fd70: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  **.** Only if pL
fd80: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
fd90: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
fda0: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
fdb0: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
fdc0: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
fdd0: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
fde0: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
fdf0: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
fe00: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
fe10: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
fe20: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
fe30: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
fe40: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
fe50: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
fe60: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
fe70: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
fe80: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
fe90: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
fea0: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
feb0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
fec0: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e  iOffset;.  int n
fed0: 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
fee0: 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  t ) return;..  /
fef0: 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
ff00: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
ff10: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
ff20: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
ff30: 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20  ntroversy about 
ff40: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
ff50: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
ff60: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
ff70: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
ff80: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
ff90: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
ffa0: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
ffb0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
ffc0: 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
ffd0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
ffe0: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  p->pOffset==0 ||
fff0: 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b   p->pLimit!=0 );
10000 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
10010 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   ){.    p->iLimi
10020 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
10030 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
10040 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
10050 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
10060 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10070 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10080 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
10090 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a  >pLimit, &n) ){.
100a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
100b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
100c0 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74  teger, n, iLimit
100d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
100e0 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
100f0 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
10100 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
10110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10120 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b 29  eGoto(v, iBreak)
10130 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
10140 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65  ( n>=0 && p->nSe
10150 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33 4c  lectRow>sqlite3L
10160 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29 7b  ogEst((u64)n) ){
10170 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
10180 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
10190 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b 0a  LogEst((u64)n);.
101a0 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
101b0 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64 4c  ags |= SF_FixedL
101c0 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  imit;.      }.  
101d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
101e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
101f0 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
10200 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
10210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10220 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
10230 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  nt, iLimit); Vdb
10240 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10250 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
10260 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
10270 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
10280 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10290 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d  , OP_IfNot, iLim
102a0 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
102b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
102c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70    }.    if( p->p
102d0 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
102e0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
102f0 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
10300 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
10310 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
10320 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
10330 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
10340 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
10350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10360 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10370 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  ->pOffset, iOffs
10380 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
10390 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
103a0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
103b0 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
103c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
103d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
103e0 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
103f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10400 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10410 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c  _OffsetLimit, iL
10420 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c  imit, iOffset+1,
10430 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
10440 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10450 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
10460 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
10470 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10480 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
10490 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
104a0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
104b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
104c0 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
104d0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
104e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
104f0 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
10500 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
10510 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
10520 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
10530 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
10540 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
10550 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
10560 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
10570 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
10580 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
10590 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
105a0 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
105b0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
105c0 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
105d0 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
105e0 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
105f0 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
10600 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
10610 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
10620 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
10630 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
10640 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
10650 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
10660 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
10670 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
10680 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
10690 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
106a0 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
106b0 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d  0 );.  /* iCol m
106c0 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ust be less than
106d0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
106e0 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e  r.  Otherwise an
106f0 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a   error would.  *
10700 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f  * have been thro
10710 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72  wn during name r
10720 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65  esolution and we
10730 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20   would not have 
10740 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  gotten.  ** this
10750 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52   far */.  if( pR
10760 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28  et==0 && ALWAYS(
10770 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
10780 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52  nExpr) ){.    pR
10790 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
107a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
107b0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
107c0 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
107d0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
107e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
107f0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
10800 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
10810 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
10820 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
10830 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
10840 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
10850 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
10860 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
10870 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
10880 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
10890 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
108a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
108b0 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
108c0 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
108d0 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
108e0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
108f0 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
10900 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
10910 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
10920 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
10930 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
10940 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
10950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
10960 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
10970 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
10980 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
10990 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
109a0 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
109b0 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
109c0 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
109d0 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
109e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
109f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10a00 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
10a10 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
10a20 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
10a30 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
10a40 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
10a50 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
10a60 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
10a70 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
10a80 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
10a90 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
10aa0 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
10ab0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
10ac0 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
10ad0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
10ae0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
10af0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
10b00 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
10b10 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
10b20 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
10b30 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
10b40 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
10b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
10b60 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
10b70 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
10b80 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
10b90 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
10ba0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
10bb0 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
10bc0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
10bd0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
10be0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
10bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
10c00 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
10c10 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
10c20 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
10c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
10c40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
10c50 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
10c60 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
10c70 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
10c80 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
10c90 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
10ca0 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
10cb0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
10cc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
10cd0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
10ce0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
10cf0 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
10d00 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
10d10 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
10d20 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
10d30 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
10d40 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
10d50 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
10d60 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
10d70 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
10d80 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
10d90 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
10da0 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dc0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
10dd0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
10de0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
10e10 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
10e20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
10e30 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
10e40 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
10e50 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
10e60 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
10e70 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
10e80 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
10e90 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
10ea0 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
10eb0 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
10ec0 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
10ed0 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
10ee0 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
10ef0 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
10f00 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
10f10 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
10f20 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
10f30 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
10f40 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10f50 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
10f60 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
10f70 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
10f80 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
10f90 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
10fa0 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
10fb0 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
10fc0 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
10fd0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
10fe0 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
10ff0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
11000 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
11010 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
11020 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
11030 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
11040 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
11050 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
11060 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
11070 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
11080 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
11090 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
110a0 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
110b0 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
110c0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
110d0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
110e0 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
110f0 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
11100 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
11110 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
11120 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
11130 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
11140 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
11150 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
11160 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
11170 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
11180 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
11190 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
111a0 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
111b0 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
111c0 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
111d0 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
111e0 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
111f0 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
11200 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
11210 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
11220 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
11230 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11240 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
11250 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
11260 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
11270 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
11280 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
11290 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
112a0 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
112b0 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
112c0 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
112d0 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
112e0 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
112f0 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
11300 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
11310 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
11320 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
11330 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
11340 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
11350 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
11360 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
11370 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
11380 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
11390 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
113a0 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
113b0 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
113c0 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
113d0 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
113e0 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
113f0 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
11400 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
11410 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
11420 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
11430 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
11440 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
11450 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
11460 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
11470 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
11480 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
11490 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
114a0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
114b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
114c0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
114d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
114e0 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
114f0 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
11500 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
11510 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
11520 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
11530 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
11540 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
11550 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
11560 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
11570 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
11580 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
11590 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
115a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
115b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
115c0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
115d0 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
115e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
115f0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
11600 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
11610 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
11620 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
11630 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
11640 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
11650 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
11660 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
11670 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
11680 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
11690 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
116a0 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
116b0 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
116c0 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
116d0 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
116e0 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
116f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11700 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
11710 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
11720 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
11730 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
11740 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
11750 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
11760 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
11770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11780 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
11790 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
117a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
117b0 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
117c0 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
117d0 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
117e0 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
117f0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
11800 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
11810 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
11820 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
11830 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
11840 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
11850 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
11860 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11890 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
118c0 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
118d0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
118e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
118f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
11900 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
11910 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  *pOffset;       
11920 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
11930 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
11940 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
11950 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
11960 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
11970 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
11980 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
11990 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
119a0 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
119b0 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
119c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
119d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
119e0 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
119f0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
11a00 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
11a10 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
11a20 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
11a30 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
11a40 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
11a50 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
11a60 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
11a70 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
11a80 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
11a90 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
11aa0 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73  >pLimit;.  pOffs
11ab0 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
11ac0 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
11ad0 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
11ae0 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
11af0 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
11b00 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
11b10 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
11b20 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
11b30 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
11b40 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
11b50 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
11b60 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
11b70 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
11b80 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
11b90 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
11ba0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
11bb0 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52  Src->a[i].fg.isR
11bc0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
11bd0 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
11be0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
11bf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11c00 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
11c10 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
11c20 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
11c30 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
11c40 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
11c50 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
11c60 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
11c70 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
11c80 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
11c90 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
11ca0 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
11cb0 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
11cc0 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
11cd0 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
11ce0 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
11cf0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
11d00 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
11d10 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
11d20 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
11d30 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
11d40 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
11d50 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
11d60 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
11d70 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
11d80 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
11d90 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
11da0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
11db0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
11dc0 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
11dd0 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
11de0 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
11df0 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
11e00 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
11e10 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
11e20 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
11e30 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
11e40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
11e50 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
11e60 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
11e70 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
11e80 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
11e90 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
11ea0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
11eb0 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
11ec0 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
11ed0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11ee0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11ef0 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
11f00 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
11f10 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
11f20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
11f30 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
11f40 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
11f50 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
11f60 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
11f70 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
11f80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11f90 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
11fa0 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
11fb0 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
11fc0 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
11fd0 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
11fe0 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
11ff0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
12000 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12010 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
12020 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
12030 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
12040 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
12050 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
12060 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
12070 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12080 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
12090 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
120a0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
120b0 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
120c0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
120d0 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
120e0 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
120f0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72  ->pNext = 0;.  r
12100 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
12110 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70  t(pParse, pSetup
12120 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20  , &destQueue);. 
12130 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
12140 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   p;.  if( rc ) g
12150 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72  oto end_of_recur
12160 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f  sive_query;..  /
12170 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
12180 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65  row in the Queue
12190 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74   and output that
121a0 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f   row */.  addrTo
121b0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
121c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
121d0 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72  nd, iQueue, addr
121e0 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
121f0 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  rage(v);..  /* T
12200 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74  ransfer the next
12210 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76   row in Queue ov
12220 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f  er to Current */
12230 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12240 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
12250 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f  ow, iCurrent); /
12260 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d  * To reset colum
12270 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28  n cache */.  if(
12280 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
12290 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
122a0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
122b0 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
122c0 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43  y->nExpr+1, regC
122d0 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  urrent);.  }else
122e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
122f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
12300 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72  wData, iQueue, r
12310 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a  egCurrent);.  }.
12320 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12330 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
12340 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
12350 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67   Output the sing
12360 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
12370 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20  t */.  addrCont 
12380 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12390 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64  eLabel(v);.  cod
123a0 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66  eOffset(v, regOf
123b0 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b  fset, addrCont);
123c0 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
123d0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
123e0 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e  >pEList, iCurren
123f0 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70  t,.      0, 0, p
12400 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Dest, addrCont, 
12410 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
12420 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20  ( regLimit ){.  
12430 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12440 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
12450 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74  mpZero, regLimit
12460 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
12470 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
12480 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12490 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
124a0 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a  (v, addrCont);..
124b0 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65    /* Execute the
124c0 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
124d0 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e  T taking the sin
124e0 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
124f0 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76  nt as.  ** the v
12500 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63  alue for the rec
12510 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74  ursive-table. St
12520 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
12530 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20  in the Queue..  
12540 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
12550 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
12560 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ate ){.    sqlit
12570 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12580 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67  e, "recursive ag
12590 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
125a0 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b  not supported");
125b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
125c0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
125d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
125e0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
125f0 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
12600 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
12610 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
12620 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
12630 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
12640 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
12650 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
12660 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
12670 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
12680 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
12690 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
126a0 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
126b0 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
126c0 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
126d0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
126e0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
126f0 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
12700 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
12710 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
12720 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70  = pLimit;.  p->p
12730 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
12740 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
12750 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12760 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46  MIT_CTE */../* F
12770 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
12780 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
12790 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
127a0 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
127b0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
127c0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
127d0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
127e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
127f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
12800 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
12810 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
12820 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12830 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12840 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12850 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  /.);../*.** Hand
12860 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  le the special c
12870 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ase of a compoun
12880 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
12890 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a  iginates from a.
128a0 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ** VALUES clause
128b0 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74  .  By handling t
128c0 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
128d0 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20   case, we avoid 
128e0 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f  deep.** recursio
128f0 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e  n, and thus do n
12900 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72  ot need to enfor
12910 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  ce the SQLITE_LI
12920 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
12930 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55  ECT.** on a VALU
12940 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ES clause..**.**
12950 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c   Because the Sel
12960 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69  ect object origi
12970 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c  nates from a VAL
12980 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20  UES clause:.**  
12990 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c   (1) It has no L
129a0 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a  IMIT or OFFSET.*
129b0 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
129c0 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
129d0 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
129e0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
129f0 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ause.*/.static i
12a00 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61  nt multiSelectVa
12a10 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lues(.  Parse *p
12a20 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
12a30 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12a40 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12a60 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
12a70 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
12a80 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12a90 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12aa0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12ab0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12ac0 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
12ad0 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e  *pPrior;.  int n
12ae0 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
12af0 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
12b00 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
12b10 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a  F_MultiValue );.
12b20 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
12b30 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
12b40 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20  SF_Values );.   
12b50 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
12b60 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70  TK_ALL || (p->op
12b70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70  ==TK_SELECT && p
12b80 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a  ->pPrior==0) );.
12b90 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12ba0 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Limit==0 );.    
12bb0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
12bc0 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  et==0 );.    ass
12bd0 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
12be0 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
12bf0 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e  Expr==p->pNext->
12c00 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
12c10 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69  .    if( p->pPri
12c20 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or==0 ) break;. 
12c30 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50     assert( p->pP
12c40 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29  rior->pNext==p )
12c50 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  ;.    p = p->pPr
12c60 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b  ior;.    nRow++;
12c70 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20  .  }while(1);.  
12c80 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
12c90 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
12ca0 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  or;.    p->pPrio
12cb0 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
12cc0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12cd0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
12ce0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
12cf0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28   pPrior;.    if(
12d00 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
12d10 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
12d20 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70   nRow;.    p = p
12d30 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  ->pNext;.  }.  r
12d40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12d50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12d60 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
12d70 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
12d80 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
12d90 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
12da0 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
12db0 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
12dc0 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
12dd0 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
12de0 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
12df0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
12e00 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
12e10 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
12e20 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
12e30 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
12e40 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
12e50 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
12e60 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
12e70 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
12e80 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
12e90 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
12ea0 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
12eb0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
12ec0 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
12ed0 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
12ee0 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
12ef0 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
12f00 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
12f10 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
12f20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
12f30 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
12f40 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
12f50 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
12f60 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
12f70 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
12f80 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
12f90 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
12fa0 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
12fb0 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
12fc0 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
12fd0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
12fe0 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
12ff0 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
13000 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
13010 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
13020 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
13040 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
13050 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
13060 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
13070 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
13080 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
13090 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
130a0 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
130b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
130c0 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
130d0 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
130e0 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
130f0 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
13100 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
13110 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
13120 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
13130 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
13140 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
13150 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
13160 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
13170 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
13180 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
13190 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
131a0 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
131b0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
131c0 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
131d0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
131e0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
131f0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
13200 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13210 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
13220 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
13230 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
13240 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
13250 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
13260 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
13270 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
13280 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13290 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
132a0 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
132b0 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
132c0 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
132d0 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
132e0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
132f0 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
13300 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
13310 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
13320 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
13330 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
13340 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
13350 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
13360 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
13370 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
13380 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
13390 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
133a0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
133b0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
133c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
133d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
133e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
133f0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
13400 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20  t iSub1 = 0;    
13410 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
13420 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
13430 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20   */.  int iSub2 
13440 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
13450 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
13460 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
13470 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
13480 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
13490 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
134a0 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
134b0 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
134c0 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
134d0 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
134e0 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
134f0 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
13500 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
13510 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
13520 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b   && p->pPrior );
13530 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e    /* Calling fun
13540 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73  ction guarantees
13550 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20   this much */.  
13560 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
13570 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
13580 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70  ive)==0 || p->op
13590 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f  ==TK_ALL || p->o
135a0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
135b0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
135c0 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
135d0 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d  pPrior;.  dest =
135e0 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
135f0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
13600 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13610 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
13620 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
13630 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
13640 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
13650 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
13660 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
13670 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
13680 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13690 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
136a0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
136b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
136c0 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
136d0 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
136e0 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
136f0 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
13700 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
13710 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
13720 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
13730 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
13740 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
13750 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13760 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
13770 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
13780 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
13790 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
137a0 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
137b0 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
137c0 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
137d0 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
137e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
137f0 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
13800 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
13810 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
13820 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13830 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
13840 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
13850 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
13860 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
13870 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
13880 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
13890 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c  /* Special handl
138a0 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ing for a compou
138b0 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f  nd-select that o
138c0 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56  riginates as a V
138d0 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20  ALUES clause..  
138e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
138f0 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
13900 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  alue ){.    rc =
13910 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
13920 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  es(pParse, p, &d
13930 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d  est);.    goto m
13940 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13950 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13960 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
13970 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
13980 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
13990 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
139a0 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
139b0 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
139c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
139d0 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
139e0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73  ->pEList );.  as
139f0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
13a00 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e  >nExpr==pPrior->
13a10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
13a20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13a30 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
13a40 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13a50 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
13a60 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65    generateWithRe
13a70 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61  cursiveQuery(pPa
13a80 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
13a90 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
13aa0 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
13ab0 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
13ac0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
13ad0 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
13ae0 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
13af0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
13b00 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
13b10 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
13b20 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
13b30 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
13b40 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13b50 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
13b60 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
13b70 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
13b80 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
13b90 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
13ba0 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ALL: {.      int
13bb0 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
13bc0 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20   int nLimit;.   
13bd0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
13be0 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
13bf0 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
13c00 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
13c10 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
13c20 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
13c30 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  et;.      pPrior
13c40 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
13c50 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
13c60 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
13c70 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
13c80 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
13c90 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
13ca0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
13cb0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13cc0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
13cd0 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
13ce0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
13cf0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
13d00 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
13d10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
13d20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
13d30 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
13d40 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
13d50 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
13d60 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
13d70 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
13d80 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
13d90 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
13da0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
13db0 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
13dc0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13dd0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
13de0 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
13df0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13e00 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
13e10 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
13e20 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
13e30 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
13e40 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
13e50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13e60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13e70 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69  v, OP_OffsetLimi
13e80 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13ea0 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
13eb0 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73  fset+1, p->iOffs
13ec0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
13ed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
13ee0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
13ef0 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
13f00 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
13f10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13f20 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
13f30 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
13f40 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
13f50 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
13f60 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
13f70 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
13f80 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
13f90 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
13fa0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
13fb0 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
13fc0 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
13fd0 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
13fe0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
13ff0 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
14000 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
14010 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
14020 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
14030 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
14040 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
14050 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  > sqlite3LogEst(
14060 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20  (u64)nLimit) .  
14070 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
14080 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
14090 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
140a0 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
140b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
140c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
140d0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
140e0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
140f0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14100 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14110 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
14120 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
14130 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
14140 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
14150 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
14160 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
14170 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
14180 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
14190 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
141a0 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
141b0 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
141c0 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
141d0 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
141e0 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
141f0 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
14200 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
14210 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
14220 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
14230 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
14240 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
14250 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
14260 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
14270 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
14280 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
14290 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
142a0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
142b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
142c0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
142d0 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
142e0 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
142f0 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
14300 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
14310 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
14320 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
14330 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
14340 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
14350 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
14360 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
14370 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14380 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
14390 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
143a0 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
143b0 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
143c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
143d0 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
143e0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
143f0 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
14400 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
14410 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
14420 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
14430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14440 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
14450 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
14460 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
14470 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
14480 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
14490 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
144a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
144b0 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
144c0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
144d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
144e0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
144f0 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
14500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14510 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14520 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
14530 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
14540 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
14550 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
14560 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
14570 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
14580 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64  dr;.        find
14590 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
145a0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
145b0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
145c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
145d0 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
145e0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
145f0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
14600 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
14610 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
14620 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
14630 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
14640 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
14650 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
14660 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
14670 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
14680 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14690 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
146a0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
146b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
146c0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
146d0 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
146e0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
146f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
14700 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
14710 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
14720 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14730 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
14740 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
14750 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
14760 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
14770 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
14780 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
14790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
147a0 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
147b0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
147c0 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
147d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
147e0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
147f0 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
14800 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
14810 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14820 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
14830 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
14840 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
14850 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
14860 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
14870 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14880 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
14890 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
148a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
148b0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
148c0 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
148d0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
148e0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
148f0 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  K );.      /* Qu
14900 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
14910 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
14920 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
14930 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
14940 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
14950 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
14960 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
14970 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
14980 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
14990 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
149a0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
149b0 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
149c0 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
149d0 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
149e0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
149f0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
14a00 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
14a10 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
14a20 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
14a30 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
14a40 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
14a50 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
14a60 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
14a70 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14a80 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
14a90 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
14aa0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
14ab0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
14ac0 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
14ad0 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
14ae0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
14af0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->iOffset = 0;..
14b00 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
14b10 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
14b20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14b30 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
14b40 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
14b50 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
14b60 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
14b70 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
14b80 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74  ( unionTab==dest
14b90 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74  .iSDParm || dest
14ba0 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
14bb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
14bc0 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
14bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
14be0 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
14bf0 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
14c00 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
14c10 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
14c20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
14c30 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
14c40 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
14c50 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
14c60 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
14c70 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
14c80 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
14c90 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
14ca0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
14cb0 28 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d  (pParse, pFirst-
14cc0 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70  >pSrc, pFirst->p
14cd0 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
14ce0 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
14cf0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
14d00 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
14d10 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
14d20 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14d30 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
14d40 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
14d50 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
14d60 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
14d70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14d80 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
14d90 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
14da0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14db0 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
14dc0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
14dd0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
14de0 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
14df0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
14e00 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
14e10 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  onTab,.         
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
14e30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
14e40 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
14e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14e60 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
14e70 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
14e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14e90 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
14ea0 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
14eb0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14ec0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14ed0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
14ee0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
14ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14f00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
14f10 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
14f20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14f30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14f40 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
14f50 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
14f60 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
14f70 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
14f80 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
14f90 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
14fa0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
14fb0 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
14fc0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
14fd0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
14fe0 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
14ff0 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
15000 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
15010 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
15020 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
15030 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
15040 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
15050 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
15060 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
15070 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
15080 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
15090 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
150a0 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
150b0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
150c0 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
150d0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
150e0 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
150f0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
15100 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
15110 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
15120 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
15130 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
15140 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
15150 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
15160 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
15170 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
15180 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
15190 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
151a0 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
151b0 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
151c0 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
151d0 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
151e0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
151f0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
15200 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
15210 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
15220 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
15230 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
15240 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
15250 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
15260 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
15270 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
15280 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
15290 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
152a0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
152b0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
152c0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
152d0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
152e0 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
152f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
15300 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
15310 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
15320 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
15330 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
15340 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
15350 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
15360 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
15370 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15380 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15390 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
153a0 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
153b0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
153c0 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
153d0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
153e0 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
153f0 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
15400 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
15410 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
15420 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
15430 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
15440 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
15450 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
15460 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
15470 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
15480 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
15490 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
154a0 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
154b0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
154c0 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
154d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
154e0 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
154f0 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
15500 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
15510 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
15520 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
15530 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
15540 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
15550 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
15560 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
15570 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
15580 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
15590 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
155a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
155b0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
155c0 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
155d0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
155e0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
155f0 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a  set = pOffset;..
15600 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
15610 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
15620 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
15630 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
15640 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
15650 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
15660 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15670 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
15680 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
15690 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
156a0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
156b0 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
156c0 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
156d0 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
156e0 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
156f0 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
15700 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
15710 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e 70  Parse, pFirst->p
15720 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  Src, pFirst->pEL
15730 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
15740 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
15750 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15760 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
15770 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
15780 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
15790 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
157a0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
157b0 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
157c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
157d0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
157e0 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
157f0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15800 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
15810 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
15820 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
15830 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
15840 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15850 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31  RowKey, tab1, r1
15860 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15870 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
15880 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
15890 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
158a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
158b0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
158c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
158d0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
158e0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
158f0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
15900 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20  >pEList, tab1,. 
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
15930 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
15940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15950 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15960 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
15970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15980 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  p2(v, OP_Next, t
15990 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64  ab1, iStart); Vd
159a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
159b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
159c0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
159d0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
159e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
159f0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
15a00 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
15a10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15a20 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
15a30 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
15a40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
15a50 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
15a60 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
15a70 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70   iSub1, iSub2, p
15a80 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a  ->op!=TK_ALL);..
15a90 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
15aa0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
15ab0 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
15ac0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
15ad0 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
15ae0 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
15af0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
15b00 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
15b10 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
15b20 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
15b30 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
15b40 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
15b50 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
15b60 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
15b70 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
15b80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15b90 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
15ba0 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
15bb0 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
15bc0 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
15bd0 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
15be0 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
15bf0 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
15c00 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
15c10 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
15c20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
15c30 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
15c40 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
15c50 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
15c60 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c80 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15c90 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
15ca0 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
15cb0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
15cc0 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
15cd0 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
15ce0 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
15d10 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
15d20 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
15d30 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
15d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15d50 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
15d60 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
15d70 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
15d80 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
15d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15da0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
15db0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
15dc0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
15dd0 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  ->pNext==0 );.  
15de0 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
15df0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
15e00 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
15e10 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
15e20 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20  , nCol, 1);.    
15e30 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
15e40 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15e50 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
15e60 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
15e70 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
15e80 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  }.    for(i=0, a
15e90 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
15ea0 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
15eb0 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
15ec0 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
15ed0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
15ee0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
15ef0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
15f00 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
15f10 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   *apColl = db->p
15f20 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
15f30 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
15f40 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
15f50 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
15f60 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  rior){.      for
15f70 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
15f80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
15f90 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  r = pLoop->addrO
15fa0 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20  penEphm[i];.    
15fb0 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29      if( addr<0 )
15fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
15fd0 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20  f [0] is unused 
15fe0 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f  then [1] is also
15ff0 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20   unused.  So we 
16000 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  can.          **
16010 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61   always safely a
16020 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20  bort as soon as 
16030 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64  the first unused
16040 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a   slot is found *
16050 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
16060 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  rt( pLoop->addrO
16070 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a  penEphm[1]<0 );.
16080 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
16090 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
160a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
160b0 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
160c0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
160d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
160e0 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P4(v, addr, (cha
160f0 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
16100 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a  oRef(pKeyInfo),.
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
16130 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
16140 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
16150 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[i] = -1;.  
16160 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16170 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
16180 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ref(pKeyInfo);. 
16190 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
161a0 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69  _end:.  pDest->i
161b0 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73  Sdst = dest.iSds
161c0 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  t;.  pDest->nSds
161d0 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a  t = dest.nSdst;.
161e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
161f0 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74  elete(db, pDelet
16200 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
16210 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
16220 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
16230 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
16240 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  ** Error message
16250 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72   for when two or
16260 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61   more terms of a
16270 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
16280 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
16290 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73  ** size result s
162a0 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ets..*/.void sql
162b0 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e  ite3SelectWrongN
162c0 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72  umTermsError(Par
162d0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
162e0 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ct *p){.  if( p-
162f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56  >selFlags & SF_V
16300 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c  alues ){.    sql
16310 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16320 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53  rse, "all VALUES
16330 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73   must have the s
16340 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  ame number of te
16350 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rms");.  }else{.
16360 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16370 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
16380 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
16390 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
163a0 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74  ".      " do not
163b0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
163c0 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
163d0 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
163e0 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
163f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
16400 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72  e an output subr
16410 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72  outine for a cor
16420 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
16430 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45  ation of a.** SE
16440 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a  LECT statment..*
16450 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f  *.** The data to
16460 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f   be output is co
16470 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e  ntained in pIn->
16480 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61 72  iSdst.  There ar
16490 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20  e.** pIn->nSdst 
164a0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75  columns to be ou
164b0 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20  tput.  pDest is 
164c0 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74  where the output
164d0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
164e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74  nt..**.** regRet
164f0 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  urn is the numbe
16500 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65  r of the registe
16510 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75  r holding the su
16520 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75  broutine.** retu
16530 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  rn address..**.*
16540 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74  * If regPrev>0 t
16550 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66 69  hen it is the fi
16560 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
16570 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a  a vector that.**
16580 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65   records the pre
16590 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d  vious output.  m
165a0 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61  em[regPrev] is a
165b0 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61   flag that is fa
165c0 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  lse.** if there 
165d0 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76  has been no prev
165e0 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66  ious output.  If
165f0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
16600 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72  code is.** gener
16610 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73  ated to suppress
16620 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b   duplicates.  pK
16630 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66  eyInfo is used f
16640 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20  or comparing.** 
16650 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  keys..**.** If t
16660 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69  he LIMIT found i
16670 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72  n p->iLimit is r
16680 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d  eached, jump imm
16690 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69  ediately to.** i
166a0 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Break..*/.static
166b0 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74   int generateOut
166c0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20  putSubroutine(. 
166d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
166e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
166f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
16700 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
16710 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16720 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16730 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
16740 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a   *pIn,        /*
16750 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c   Coroutine suppl
16760 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53  ying data */.  S
16770 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
16780 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ,      /* Where 
16790 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61  to send the data
167a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74   */.  int regRet
167b0 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  urn,          /*
167c0 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72   The return addr
167d0 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ess register */.
167e0 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20    int regPrev,  
167f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
16800 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67  vious result reg
16810 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75  ister.  No uniqu
16820 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20  eness if 0 */.  
16830 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16840 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63  o,      /* For c
16850 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72  omparing with pr
16860 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a  evious entry */.
16870 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
16880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
16890 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74  p here if we hit
168a0 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b   the LIMIT */.){
168b0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
168c0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
168d0 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  t iContinue;.  i
168e0 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72  nt addr;..  addr
168f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
16900 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
16910 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  iContinue = sqli
16920 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16930 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  (v);..  /* Suppr
16940 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20 66  ess duplicates f
16950 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  or UNION, EXCEPT
16960 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
16970 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50  .  */.  if( regP
16980 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  rev ){.    int a
16990 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20  ddr1, addr2;.   
169a0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
169b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
169c0 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29  _IfNot, regPrev)
169d0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
169e0 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
169f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16a00 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
16a10 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
16a20 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
16a30 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
16a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a50 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
16a60 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
16a70 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
16a80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16a90 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
16aa0 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f  mp, addr2+2, iCo
16ab0 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29  ntinue, addr2+2)
16ac0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16ad0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16ae0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
16af0 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
16b00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16b10 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64  P_Copy, pIn->iSd
16b20 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
16b30 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20  In->nSdst-1);.  
16b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16b50 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
16b60 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
16b70 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
16b80 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16b90 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
16ba0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
16bb0 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65  e first OFFSET e
16bc0 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20  ntries if there 
16bd0 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  is an OFFSET cla
16be0 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f  use.  */.  codeO
16bf0 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
16c00 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
16c10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73  ..  assert( pDes
16c20 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78  t->eDest!=SRT_Ex
16c30 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74  ists );.  assert
16c40 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  ( pDest->eDest!=
16c50 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73  SRT_Table );.  s
16c60 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44  witch( pDest->eD
16c70 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74  est ){.    /* St
16c80 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
16c90 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
16ca0 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
16cb0 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
16cc0 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
16cd0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
16ce0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16cf0 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  se);.      int r
16d00 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
16d10 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16d20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16d30 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
16d40 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
16d50 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  dst, pIn->nSdst,
16d60 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
16d70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16d80 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
16d90 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32  est->iSDParm, r2
16da0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16db0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16dc0 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  _Insert, pDest->
16dd0 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  iSDParm, r1, r2)
16de0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16df0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
16e00 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
16e10 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
16e20 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16e30 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
16e40 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16e50 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
16e60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16e70 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16e80 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16e90 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
16ea0 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
16eb0 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
16ec0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
16ed0 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
16ee0 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
16ef0 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
16f00 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
16f10 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
16f20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
16f30 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
16f40 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
16f50 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
16f60 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
16f70 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73  int r1;.      as
16f80 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
16f90 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==1 || pParse->n
16fa0 45 72 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 70  Err>0 );.      p
16fb0 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20  Dest->affSdst = 
16fc0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
16fd0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
16fe0 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  (p->pEList->a[0]
16ff0 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
17000 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72  ffSdst);.      r
17010 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
17020 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
17030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17040 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
17050 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
17060 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65  dst, 1, r1, &pDe
17070 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a  st->affSdst,1);.
17080 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17090 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
170a0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
170b0 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  ->iSdst, 1);.   
170c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
170d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
170e0 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
170f0 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
17100 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17110 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17120 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
17130 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
17140 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
17150 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
17160 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
17170 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
17180 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
17190 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
171a0 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
171b0 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
171c0 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
171d0 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
171e0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
171f0 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
17200 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
17210 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==1 || pParse->n
17220 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61  Err>0 );  testca
17230 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d  se( pIn->nSdst!=
17240 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
17250 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
17260 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
17270 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
17280 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
17290 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
172a0 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
172b0 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
172c0 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
172d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
172e0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
172f0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
17300 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  /..    /* The re
17310 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
17320 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
17330 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
17340 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
17350 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68  Dest->iSdst.  Th
17360 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  en the co-routin
17370 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f  e yields..    */
17380 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
17390 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
173a0 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
173b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
173c0 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73  pDest->iSdst = s
173d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
173e0 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
173f0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nSdst);.        
17400 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70  pDest->nSdst = p
17410 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20  In->nSdst;.     
17420 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
17430 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
17440 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
17450 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70   pDest->iSdst, p
17460 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
17470 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17480 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
17490 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
174a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
174b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
174c0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76  none of the abov
174d0 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e, then the resu
174e0 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d  lt destination m
174f0 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52  ust be.    ** SR
17500 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20  T_Output.  This 
17510 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
17520 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79   called with any
17530 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65   other.    ** de
17540 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20  stination other 
17550 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61  than the ones ha
17560 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53  ndled above or S
17570 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a  RT_Output..    *
17580 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54  *.    ** For SRT
17590 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73  _Output, results
175a0 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
175b0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
175c0 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a  isters.  .    **
175d0 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73   Then the OP_Res
175e0 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73  ultRow opcode is
175f0 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73   used to cause s
17600 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f  qlite3_step() to
17610 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  .    ** return t
17620 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72  he next row of r
17630 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  esult..    */.  
17640 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
17650 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
17660 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
17670 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  put );.      sql
17680 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17690 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
176a0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
176b0 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
176c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
176d0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
176e0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
176f0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17710 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  }.  }..  /* Jump
17720 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
17730 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
17740 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
17750 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
17760 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
17770 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17780 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
17790 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
177a0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
177b0 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
177c0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
177d0 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
177e0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
177f0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
17800 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
17810 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17820 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
17830 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
17840 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
17850 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76  /*.** Alternativ
17860 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
17870 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  t code generator
17880 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20   for cases when 
17890 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f  there.** is an O
178a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
178b0 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
178c0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
178d0 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a  ollowing form:.*
178e0 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63  *.**      <selec
178f0 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20  tA>  <operator> 
17900 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45   <selectB>  ORDE
17910 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73  R BY <orderbylis
17920 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74  t>.**.** <operat
17930 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e  or> is one of UN
17940 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20  ION ALL, UNION, 
17950 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
17960 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a  SECT.  The idea.
17970 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f  ** is to code bo
17980 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64  th <selectA> and
17990 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20   <selectB> with 
179a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
179b0 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75  use as.** co-rou
179c0 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e  tines.  Then run
179d0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73   the co-routines
179e0 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64   in parallel and
179f0 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c   merge the resul
17a00 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f  ts.** into the o
17a10 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74  utput.  In addit
17a20 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63  ion to the two c
17a30 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65  oroutines (calle
17a40 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a  d selectA and.**
17a50 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20   selectB) there 
17a60 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65  are 7 subroutine
17a70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41  s:.**.**    outA
17a80 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
17a90 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
17aa0 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctA coroutine in
17ab0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
17ad0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
17ae0 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  ry..**.**    out
17af0 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  B:    Move the o
17b00 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
17b10 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectB coroutine i
17b20 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
17b30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
17b40 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
17b50 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65  ery.  (Only gene
17b60 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20  rated for UNION 
17b70 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
17b80 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45     UNION ALL.  E
17b90 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54  XCEPT and INSERT
17ba0 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75  SECT never outpu
17bb0 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20  t a row that.** 
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
17bd0 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a  ars only in B.).
17be0 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20  **.**    AltB:  
17bf0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
17c00 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
17c10 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
17c20 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20   and A<B..**.** 
17c30 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c     AeqB:    Call
17c40 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
17c50 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
17c60 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
17c70 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67  ==B..**.**    Ag
17c80 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
17c90 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
17ca0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
17cb0 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a  tines and A>B..*
17cc0 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20  *.**    EofA:   
17cd0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
17ce0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
17cf0 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a  rom selectA..**.
17d00 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43  **    EofB:    C
17d10 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
17d20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
17d30 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a  m selectB..**.**
17d40 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
17d50 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65  ion of the latte
17d60 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e  r five subroutin
17d70 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69  es depend on whi
17d80 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  ch .** <operator
17d90 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a  > is used:.**.**
17da0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17db0 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20  UNION ALL       
17dc0 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20    UNION         
17dd0 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20     EXCEPT       
17de0 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20     INTERSECT.** 
17df0 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
17e00 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
17e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
17e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
17e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
17e40 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20    AltB:   outA, 
17e50 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
17e60 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
17e70 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
17e80 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
17e90 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  eqB:   outA, nex
17ea0 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
17ec0 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c  tA         outA,
17ed0 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
17ee0 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  gtB:   outB, nex
17ef0 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
17f00 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78  xtB          nex
17f10 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  tB            ne
17f20 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41  xtB.**.**   EofA
17f30 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
17f40 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
17f50 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20            halt  
17f60 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a             halt.
17f70 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20  **.**   EofB:   
17f80 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
17f90 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
17fa0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17fb0 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
17fc0 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41  * In the AltB, A
17fd0 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75  eqB, and AgtB su
17fe0 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f  broutines, an EO
17ff0 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67  F on A following
18000 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73   nextA.** causes
18010 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
18020 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61  mp to EofA and a
18030 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f  n EOF on B follo
18040 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65  wing nextB cause
18050 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74  s.** an immediat
18060 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20  e jump to EofB. 
18070 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64   Within EofA and
18080 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f   EofB, and EOF o
18090 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f  n entry or.** fo
180a0 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61  llowing nextX ca
180b0 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74  uses a jump to t
180c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65  he end of the se
180d0 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  lect processing.
180e0 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  .**.** Duplicate
180f0 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20   removal in the 
18100 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
18110 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73  nd INTERSECT cas
18120 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a  es is handled.**
18130 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70   within the outp
18140 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ut subroutine.  
18150 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69  The regPrev regi
18160 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74  ster set holds t
18170 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  he previously.**
18180 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20   output value.  
18190 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  A comparison is 
181a0 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69  made against thi
181b0 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  s value and the 
181c0 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69  output.** is ski
181d0 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74  pped if the next
181e0 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62   results would b
181f0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
18200 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a  e previous..**.*
18210 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
18220 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20  tion plan is to 
18230 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77  implement the tw
18240 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  o coroutines and
18250 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75   seven.** subrou
18260 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65  tines first, the
18270 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f  n put the contro
18280 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62  l logic at the b
18290 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69  ottom.  Like thi
182a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
182b0 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20    goto Init.**  
182c0 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e     coA: coroutin
182d0 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79  e for left query
182e0 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a   (A).**     coB:
182f0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
18300 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a  ight query (B).*
18310 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75  *    outA: outpu
18320 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a  t one row of A.*
18330 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75  *    outB: outpu
18340 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28  t one row of B (
18350 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20  UNION and UNION 
18360 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20  ALL only).**    
18370 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofA: ....**    
18380 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofB: ....**    
18390 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AltB: ....**    
183a0 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AeqB: ....**    
183b0 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AgtB: ....**    
183c0 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65  Init: initialize
183d0 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73   coroutine regis
183e0 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ters.**         
183f0 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20   yield coA.**   
18400 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29         if eof(A)
18410 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20   goto EofA.**   
18420 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42         yield coB
18430 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
18440 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42  eof(B) goto EofB
18450 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d  .**    Cmpr: Com
18460 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20  pare A, B.**    
18470 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c        Jump AltB,
18480 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20   AeqB, AgtB.**  
18490 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a     End: ....**.*
184a0 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20  * We call AltB, 
184b0 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41  AeqB, AgtB, EofA
184c0 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72  , and EofB "subr
184d0 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65  outines" but the
184e0 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74  y are not.** act
184f0 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69  ually called usi
18500 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65  ng Gosub and the
18510 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e  y do not Return.
18520 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20    EofA and EofB 
18530 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c  loop.** until al
18540 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  l data is exhaus
18550 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ted then jump to
18560 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e   the "end" labe.
18570 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a    AltB, AeqB,.**
18580 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74   and AgtB jump t
18590 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74  o either L2 or t
185a0 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72  o one of EofA or
185b0 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65   EofB..*/.#ifnde
185c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
185d0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74  MPOUND_SELECT.st
185e0 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
185f0 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
18600 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18610 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
18620 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
18630 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
18640 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
18650 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
18660 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
18670 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
18680 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
18690 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
186a0 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
186b0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
186c0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
186d0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65  unters */.  Sele
186e0 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
186f0 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
18700 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
18710 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
18720 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
18730 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
18740 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
18750 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
18760 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20  Dest destA;     
18770 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
18780 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a  or coroutine A *
18790 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
187a0 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73  estB;     /* Des
187b0 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
187c0 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e  outine B */.  in
187d0 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20  t regAddrA;     
187e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
187f0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
18800 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
18810 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42  /.  int regAddrB
18820 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18830 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18840 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  r select-B corou
18850 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
18860 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
18870 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18880 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
18890 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
188a0 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
188b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
188c0 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
188d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
188e0 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
188f0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
18900 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
18910 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
18920 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
18930 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
18940 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
18950 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
18960 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18970 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
18980 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18990 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
189a0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
189b0 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
189c0 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
189d0 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
189e0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
189f0 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
18a00 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18a10 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
18a20 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
18a30 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18a40 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20   addrEofA_noB;  
18a50 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20     /* Alternate 
18a60 61 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73  addrEofA if B is
18a70 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a   uninitialized *
18a80 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
18a90 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18aa0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
18ab0 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
18ac0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18ad0 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
18ae0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18af0 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
18b00 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18b10 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
18b20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18b30 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
18b40 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18b50 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
18b60 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18b70 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
18b80 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
18b90 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
18ba0 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
18bb0 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
18bc0 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
18bd0 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
18be0 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
18bf0 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
18c00 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
18c10 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
18c20 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
18c30 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
18c40 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
18c50 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
18c60 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
18c70 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
18c80 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
18c90 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
18ca0 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
18cb0 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
18cc0 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
18cd0 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
18ce0 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
18cf0 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
18d00 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
18d10 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
18d20 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
18d30 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
18d40 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
18d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
18d60 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
18d70 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
18d80 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
18d90 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
18da0 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
18db0 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
18dc0 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
18dd0 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
18de0 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
18df0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
18e00 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
18e10 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
18e20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
18e30 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
18e40 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
18e50 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
18e60 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
18e70 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
18e80 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
18e90 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
18ea0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
18eb0 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
18ec0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
18ed0 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
18ee0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18ef0 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
18f00 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
18f10 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
18f20 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
18f30 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
18f40 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
18f50 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
18f60 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18f70 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
18f80 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20  int iSub1;      
18f90 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
18fa0 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
18fb0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
18fc0 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
18fd0 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
18fe0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
18ff0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
19000 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
19010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
19020 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
19030 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
19040 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
19050 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
19060 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
19070 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
19080 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
19090 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  0 );       /* Al
190a0 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65  ready thrown the
190b0 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61   error if VDBE a
190c0 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
190d0 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69   labelEnd = sqli
190e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
190f0 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  (v);.  labelCmpr
19100 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
19110 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20  keLabel(v);...  
19120 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20  /* Patch up the 
19130 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
19140 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f    */.  op = p->o
19150 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20  p;  .  pPrior = 
19160 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
19170 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ert( pPrior->pOr
19180 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f  derBy==0 );.  pO
19190 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
191a0 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20  erBy;.  assert( 
191b0 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f  pOrderBy );.  nO
191c0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
191d0 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20  y->nExpr;..  /* 
191e0 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74  For operators ot
191f0 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
19200 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61  LL we have to ma
19210 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a  ke sure that.  *
19220 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
19230 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65  lause covers eve
19240 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72  ry term of the r
19250 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a  esult set.  Add.
19260 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68    ** terms to th
19270 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19280 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
19290 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54    */.  if( op!=T
192a0 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72  K_ALL ){.    for
192b0 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (i=1; db->malloc
192c0 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d  Failed==0 && i<=
192d0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
192e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
192f0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
19300 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
19310 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
19320 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
19330 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49  OrderBy; j++, pI
19340 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
19350 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
19360 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
19370 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
19380 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
19390 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61  rByCol==i ) brea
193a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
193b0 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79   if( j==nOrderBy
193c0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
193d0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
193e0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45  Expr(db, TK_INTE
193f0 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  GER, 0);.       
19400 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
19410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
19420 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
19430 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
19440 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20  EP_IntValue;.   
19450 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61       pNew->u.iVa
19460 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  lue = i;.       
19470 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69   pOrderBy = sqli
19480 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
19490 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  d(pParse, pOrder
194a0 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  By, pNew);.     
194b0 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
194c0 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f  ) pOrderBy->a[nO
194d0 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f  rderBy++].u.x.iO
194e0 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
194f0 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
19500 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
19510 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
19520 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
19530 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
19540 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
19550 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
19560 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
19570 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
19580 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
19590 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
195a0 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
195b0 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
195c0 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
195d0 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
195e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
195f0 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
19600 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
19610 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
19620 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
19630 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
19640 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
19650 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
19660 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
19670 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
19680 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
19690 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72  eof(int)*(nOrder
196a0 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20  By + 1));.  if( 
196b0 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
196c0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
196d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
196e0 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e   aPermute[0] = n
196f0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72  OrderBy;.    for
19700 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=1, pItem=pOrd
19710 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64  erBy->a; i<=nOrd
19720 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  erBy; i++, pItem
19730 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
19740 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
19750 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
19760 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
19770 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
19780 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
19790 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
197a0 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
197b0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
197c0 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  Col - 1;.    }. 
197d0 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d     pKeyMerge = m
197e0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
197f0 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
19800 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b   p, 1);.  }else{
19810 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
19820 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
19830 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  attach the ORDER
19840 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68   BY clause to th
19850 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
19860 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
19870 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72  rderBy;.  pPrior
19880 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
19890 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
198a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
198b0 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  erBy, 0);..  /* 
198c0 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65  Allocate a range
198d0 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65   of temporary re
198e0 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
198f0 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20  KeyInfo needed. 
19900 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69   ** for the logi
19910 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64  c that removes d
19920 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20  uplicate result 
19930 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20  rows when the.  
19940 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ** operator is U
19950 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
19960 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20   INTERSECT (but 
19970 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  not UNION ALL)..
19980 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
19990 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
199a0 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Prev = 0;.  }els
199b0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  e{.    int nExpr
199c0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
199d0 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
199e0 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72   nOrderBy>=nExpr
199f0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
19a00 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50  iled );.    regP
19a10 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
19a20 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
19a30 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b  ->nMem += nExpr+
19a40 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
19a50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19a60 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
19a70 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
19a80 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
19a90 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
19aa0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  , 1);.    if( pK
19ab0 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61  eyDup ){.      a
19ac0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
19ad0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
19ae0 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20  (pKeyDup) );.   
19af0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
19b00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
19b10 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c     pKeyDup->aCol
19b20 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
19b30 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
19b40 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , p, i);.       
19b50 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f   pKeyDup->aSortO
19b60 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  rder[i] = 0;.   
19b70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
19b80 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74  .  /* Separate t
19b90 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20  he left and the 
19ba0 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d  right query from
19bb0 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a   one another.  *
19bc0 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
19bd0 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  0;.  pPrior->pNe
19be0 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  xt = 0;.  sqlite
19bf0 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
19c00 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
19c10 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
19c20 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72  DER");.  if( pPr
19c30 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
19c40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
19c50 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
19c60 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
19c70 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
19c80 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d  y, "ORDER");.  }
19c90 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
19ca0 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
19cb0 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
19cc0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
19cd0 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
19ce0 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
19cf0 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
19d00 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
19d10 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
19d20 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
19d30 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
19d40 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
19d50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19d60 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
19d70 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
19d80 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
19dc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19dd0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
19de0 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
19df0 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
19e00 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
19e10 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
19e20 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
19e30 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
19e40 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
19e50 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
19e60 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
19e70 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e  >pOffset);.  p->
19e80 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  pOffset = 0;..  
19e90 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
19ea0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
19eb0 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65  AddrB = ++pParse
19ec0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
19ed0 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
19ee0 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
19ef0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19f00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
19f10 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
19f20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
19f30 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
19f40 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
19f50 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
19f60 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
19f70 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
19f80 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
19f90 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
19fa0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
19fb0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74  to the.  ** left
19fc0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
19fd0 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20   operator - the 
19fe0 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  "A" select..  */
19ff0 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d  .  addrSelectA =
1a000 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1a010 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
1a020 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
1a030 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a040 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1a050 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64   regAddrA, 0, ad
1a060 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64  drSelectA);.  Vd
1a070 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c  beComment((v, "l
1a080 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
1a090 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
1a0a0 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
1a0b0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
1a0c0 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
1a0d0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
1a0e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
1a0f0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
1a100 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
1a110 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69  e3VdbeEndCorouti
1a120 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b  ne(v, regAddrA);
1a130 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
1a140 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
1a150 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1a160 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
1a170 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
1a180 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
1a190 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
1a1a0 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
1a1b0 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
1a1c0 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
1a1d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1a1e0 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20   + 1;.  addr1 = 
1a1f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a200 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
1a210 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c  utine, regAddrB,
1a220 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29   0, addrSelectB)
1a230 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
1a240 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43  (v, "right SELEC
1a250 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d  T"));.  savedLim
1a260 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
1a270 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20    savedOffset = 
1a280 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
1a290 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
1a2a0 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  itB;.  p->iOffse
1a2b0 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61  t = 0;  .  expla
1a2c0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
1a2d0 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
1a2e0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
1a2f0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1a300 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
1a310 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
1a320 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
1a330 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
1a340 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
1a350 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1a360 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  v, regAddrB);.. 
1a370 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1a380 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1a390 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1a3a0 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
1a3b0 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1a3c0 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1a3d0 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1a3e0 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1a3f0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1a400 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
1a410 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
1a420 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
1a430 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
1a440 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a460 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
1a470 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
1a480 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
1a490 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
1a4a0 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
1a4b0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1a4c0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1a4d0 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
1a4e0 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
1a4f0 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
1a500 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
1a510 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1a520 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
1a530 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
1a540 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
1a550 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1a560 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1a570 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
1a580 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
1a590 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1a5a0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1a5b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a5c0 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
1a5d0 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1a5f0 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1a600 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
1a610 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
1a620 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
1a630 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1a640 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
1a650 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
1a660 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
1a670 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
1a680 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
1a690 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
1a6a0 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
1a6b0 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
1a6c0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
1a6d0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1a6e0 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45  EofA_noB = addrE
1a6f0 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a  ofA = labelEnd;.
1a700 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1a710 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a720 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
1a730 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1a740 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
1a750 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a760 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1a770 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61  addrOutB);.    a
1a780 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71  ddrEofA_noB = sq
1a790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a7a0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a7b0 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrB, labelEnd)
1a7c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1a7f0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1a800 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1a810 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d  ddrEofA);.    p-
1a820 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
1a830 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
1a840 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50  ->nSelectRow, pP
1a850 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1a860 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1a870 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1a880 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
1a890 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
1a8a0 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
1a8b0 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
1a8c0 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
1a8d0 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
1a8e0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1a8f0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1a900 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
1a910 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70  rEofA;.    if( p
1a920 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70  ->nSelectRow > p
1a930 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1a940 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
1a950 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
1a960 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b  ectRow;.  }else{
1a970 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
1a980 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
1a990 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1a9a0 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1a9b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a9c0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1a9d0 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1a9e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a9f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1aa00 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1aa10 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43  labelEnd); VdbeC
1aa20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1aa30 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1aa40 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  v, addrEofB);.  
1aa50 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1aa60 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1aa70 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a  the case of A<B.
1aa80 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1aa90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74  omment((v, "A-lt
1aaa0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1aab0 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73  ;.  addrAltB = s
1aac0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1aad0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1aae0 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
1aaf0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1ab00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1ab10 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1ab20 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1ab30 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1ab40 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1ab50 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1ab60 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1ab70 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1ab80 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
1ab90 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
1aba0 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1abb0 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
1abc0 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
1abd0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1abe0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
1abf0 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
1ac00 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1ac10 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1ac20 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
1ac30 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1ac40 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
1ac50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ac60 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1ac70 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1ac80 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1ac90 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1aca0 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1acb0 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
1acc0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1acd0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1ace0 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
1acf0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1ad00 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
1ad10 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
1ad20 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
1ad30 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1ad40 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
1ad50 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
1ad60 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
1ad70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ad80 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1ad90 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1ada0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
1adb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1adc0 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1add0 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1ade0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1adf0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1ae00 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1ae10 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f  This code runs o
1ae20 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
1ae30 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20  e everything..  
1ae40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1ae50 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1ae60 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
1ae70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1ae80 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1ae90 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64  ddrEofA_noB); Vd
1aea0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1aeb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1aec0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1aed0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1aee0 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1aef0 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  e(v);..  /* Impl
1af00 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
1af10 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
1af20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1af30 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1af40 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
1af50 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1af60 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
1af70 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
1af80 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
1af90 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
1afa0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1afb0 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
1afc0 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64  iSdst, destB.iSd
1afd0 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  st, nOrderBy,.  
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aff0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1b000 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
1b010 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
1b020 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
1b030 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a  PFLAG_PERMUTE);.
1b040 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b050 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
1b060 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
1b070 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56  qB, addrAgtB); V
1b080 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b090 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
1b0a0 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
1b0b0 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
1b0c0 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
1b0d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1b0e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1b0f0 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
1b100 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
1b110 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
1b120 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  s.  */.  if( pDe
1b130 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
1b140 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c  utput ){.    Sel
1b150 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50  ect *pFirst = pP
1b160 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  rior;.    while(
1b170 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
1b180 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
1b190 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67  t->pPrior;.    g
1b1a0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
1b1b0 65 73 28 70 50 61 72 73 65 2c 20 70 46 69 72 73  es(pParse, pFirs
1b1c0 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d  t->pSrc, pFirst-
1b1d0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  >pEList);.  }.. 
1b1e0 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74   /* Reassembly t
1b1f0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1b200 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
1b210 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65  l be freed corre
1b220 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  ctly.  ** by the
1b230 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1b240 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  n */.  if( p->pP
1b250 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rior ){.    sqli
1b260 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1b270 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  db, p->pPrior);.
1b280 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20    }.  p->pPrior 
1b290 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69  = pPrior;.  pPri
1b2a0 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a  or->pNext = p;..
1b2b0 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
1b2c0 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
1b2d0 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
1b2e0 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
1b2f0 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
1b300 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78  eries ****/.  ex
1b310 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
1b320 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
1b330 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a  ub1, iSub2, 0);.
1b340 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
1b350 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64  >nErr!=0;.}.#end
1b360 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
1b370 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1b380 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1b390 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1b3a0 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20  IEW)./* Forward 
1b3b0 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
1b3c0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1b3d0 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65  tExprList(sqlite
1b3e0 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69  3*, ExprList*, i
1b3f0 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  nt, ExprList*);.
1b400 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1b410 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a  tSelect(sqlite3*
1b420 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  , Select *, int,
1b430 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 29   ExprList*, int)
1b440 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  ;../*.** Scan th
1b450 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
1b460 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
1b470 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
1b480 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
1b490 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
1b4a0 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
1b4b0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
1b4c0 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
1b4d0 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
1b4e0 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
1b4f0 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
1b500 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
1b510 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
1b520 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
1b530 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
1b540 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
1b550 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
1b560 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
1b570 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
1b580 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
1b590 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
1b5a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1b5b0 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
1b5c0 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
1b5d0 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
1b5e0 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
1b5f0 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
1b600 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1b610 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73   make the necess
1b620 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  ary .** changes 
1b630 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  to pExpr so that
1b640 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63   it refers direc
1b650 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63  tly to the sourc
1b660 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68  e table.** of th
1b670 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65  e subquery rathe
1b680 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
1b690 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1b6a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
1b6b0 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 73   *substExpr(.  s
1b6c0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1b6d0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
1b6e0 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68  loc errors to th
1b6f0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  is connection */
1b700 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
1b710 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69         /* Expr i
1b720 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75  n which substitu
1b730 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20  tion occurs */. 
1b740 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1b750 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1b760 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
1b770 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1b780 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73  EList    /* Subs
1b790 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f  titute expressio
1b7a0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ns */.){.  if( p
1b7b0 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
1b7c0 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
1b7d0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
1b7e0 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
1b7f0 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
1b800 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
1b810 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
1b820 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
1b830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b840 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
1b850 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
1b860 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
1b870 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
1b880 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1b890 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
1b8a0 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
1b8b0 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1b8c0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
1b8d0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
1b8e0 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
1b8f0 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20  iColumn].pExpr, 
1b900 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1b910 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1b920 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 45  pExpr);.      pE
1b930 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  xpr = pNew;.    
1b940 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
1b950 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75  Expr->pLeft = su
1b960 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70  bstExpr(db, pExp
1b970 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
1b980 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
1b990 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
1b9a0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
1b9b0 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pr->pRight, iTab
1b9c0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b9d0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1b9e0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1b9f0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1ba00 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
1ba10 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  b, pExpr->x.pSel
1ba20 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
1ba30 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  ist, 1);.    }el
1ba40 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45  se{.      substE
1ba50 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70  xprList(db, pExp
1ba60 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  r->x.pList, iTab
1ba70 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1ba80 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ba90 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20  pExpr;.}.static 
1baa0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1bab0 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st(.  sqlite3 *d
1bac0 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
1bad0 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
1bae0 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
1baf0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
1bb00 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
1bb10 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
1bb20 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1bb30 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
1bb40 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1bb50 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
1bb60 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
1bb70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
1bb80 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
1bb90 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
1bba0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1bbb0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1bbc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1bbd0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1bbe0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1bbf0 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1bc00 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  r(db, pList->a[i
1bc10 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
1bc20 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
1bc30 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1bc40 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74  tSelect(.  sqlit
1bc50 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1bc60 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
1bc70 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
1bc80 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1bc90 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
1bca0 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
1bcb0 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1bcc0 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
1bcd0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1bce0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1bcf0 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20  be replaced */. 
1bd00 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1bd10 74 2c 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t,    /* Substit
1bd20 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ute values */.  
1bd30 69 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20  int doPrior     
1bd40 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74       /* Do subst
1bd50 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72  itutes on p->pPr
1bd60 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20  ior too */.){.  
1bd70 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
1bd80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1bd90 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1bda0 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29  nt i;.  if( !p )
1bdb0 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20   return;.  do{. 
1bdc0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1bdd0 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
1bde0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1bdf0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1be00 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
1be10 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
1be20 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
1be30 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f  prList(db, p->pO
1be40 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
1be50 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
1be60 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1be70 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  xpr(db, p->pHavi
1be80 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ng, iTable, pELi
1be90 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  st);.    p->pWhe
1bea0 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  re = substExpr(d
1beb0 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54  b, p->pWhere, iT
1bec0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1bed0 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72     pSrc = p->pSr
1bee0 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1bef0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  Src!=0 );.    fo
1bf00 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1bf10 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1bf20 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1bf30 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1bf40 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
1bf50 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1bf60 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20   pEList, 1);.   
1bf70 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1bf80 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
1bf90 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1bfa0 69 73 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75  ist(db, pItem->u
1bfb0 31 2e 70 46 75 6e 63 41 72 67 2c 20 69 54 61 62  1.pFuncArg, iTab
1bfc0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1bfd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68     }.    }.  }wh
1bfe0 69 6c 65 28 20 64 6f 50 72 69 6f 72 20 26 26 20  ile( doPrior && 
1bff0 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21  (p = p->pPrior)!
1c000 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  =0 );.}.#endif /
1c010 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
1c020 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1c030 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1c040 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
1c050 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
1c060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1c070 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1c080 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1c090 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EW)./*.** This r
1c0a0 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
1c0b0 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
1c0c0 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66 6f  eries as a perfo
1c0d0 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74  rmance optimizat
1c0e0 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
1c0f0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69  tine returns 1 i
1c100 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
1c110 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
1c120 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73  lattening occurs
1c130 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
1c140 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
1c150 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
1c160 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
1c170 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
1c180 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1c190 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
1c1a0 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
1c1b0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
1c1c0 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
1c1d0 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
1c1e0 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
1c1f0 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
1c200 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
1c210 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
1c220 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1c230 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
1c240 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
1c250 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
1c260 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
1c270 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
1c280 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
1c290 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
1c2a0 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
1c2b0 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
1c2c0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
1c2d0 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
1c2e0 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
1c2f0 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
1c300 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1c310 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
1c320 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
1c330 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1c340 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
1c350 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
1c360 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
1c370 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
1c380 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
1c390 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1c3a0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1c3b0 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
1c3c0 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
1c3d0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
1c3e0 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63  r this simplific
1c3f0 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
1c400 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
1c410 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
1c420 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
1c430 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
1c440 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
1c450 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
1c460 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
1c470 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
1c480 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
1c490 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
1c4a0 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
1c4b0 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
1c4c0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
1c4d0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
1c4e0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
1c4f0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
1c500 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
1c510 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
1c520 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
1c530 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
1c540 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
1c550 72 65 67 61 74 65 20 6f 72 20 28 32 61 29 20 74  regate or (2a) t
1c560 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1c570 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20  s not a join.** 
1c580 20 20 20 20 20 20 20 61 6e 64 20 28 32 62 29 20         and (2b) 
1c590 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c5a0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 75 62  does not use sub
1c5b0 71 75 65 72 69 65 73 20 6f 74 68 65 72 20 74 68  queries other th
1c5c0 61 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20  an the one.**   
1c5d0 20 20 20 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65       FROM-clause
1c5e0 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69   subquery that i
1c5f0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
1c600 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28  r flattening.  (
1c610 32 62 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  2b is.**        
1c620 64 75 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32  due to ticket [2
1c630 66 37 31 37 30 64 37 33 62 66 39 61 62 66 38 30  f7170d73bf9abf80
1c640 5d 20 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30  ] from 2015-02-0
1c650 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  9.).**.**   (3) 
1c660 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1c670 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   not the right o
1c680 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
1c690 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20   outer join.**  
1c6a0 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c        (Originall
1c6b0 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20  y ticket #306.  
1c6c0 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79 20  Strengthened by 
1c6d0 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a  ticket #3300).**
1c6e0 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
1c6f0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
1c700 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
1c710 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69  (**)  At one poi
1c720 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  nt restrictions 
1c730 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69  (4) and (5) defi
1c740 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20  ned a subset of 
1c750 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20  DISTINCT.**     
1c760 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74     sub-queries t
1c770 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65  hat were exclude
1c780 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69  d from this opti
1c790 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69  mization. Restri
1c7a0 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20  ction .**       
1c7b0 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62   (4) has since b
1c7c0 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20  een expanded to 
1c7d0 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54  exclude all DIST
1c7e0 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e  INCT subqueries.
1c7f0 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
1c800 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1c810 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
1c820 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
1c830 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
1c840 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
1c850 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
1c860 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
1c870 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1c880 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
1c890 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
1c8a0 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
1c8b0 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
1c8c0 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f  dding a FROM clo
1c8d0 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63  se with the spec
1c8e0 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61  ial.**        ta
1c8f0 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20  ble sqlite_once 
1c900 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
1c910 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f   a single row co
1c920 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20  ntaining a.**   
1c930 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c       single NULL
1c940 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
1c950 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c960 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1c970 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1c980 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
1c990 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
1c9a0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1c9b0 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
1c9c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c9d0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
1c9e0 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
1c9f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1ca00 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30   Restriction (10
1ca10 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72  ) was removed fr
1ca20 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32  om the code on 2
1ca30 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65  005-02-05 but we
1ca40 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64  .**        accid
1ca50 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68  ently carried th
1ca60 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72  e comment forwar
1ca70 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d  d until 2014-09-
1ca80 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a  15.  Original.**
1ca90 20 20 20 20 20 20 20 20 74 65 78 74 3a 20 22 54          text: "T
1caa0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1cab0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1cac0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1cad0 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20   query .**      
1cae0 20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c    does not use L
1caf0 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31  IMIT.".**.**  (1
1cb00 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1cb10 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
1cb20 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1cb30 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
1cb40 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
1cb50 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65  **)  Not impleme
1cb60 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20  nted.  Subsumed 
1cb70 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  into restriction
1cb80 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69   (3).  Was previ
1cb90 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ously.**        
1cba0 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72  a separate restr
1cbb0 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20  iction deriving 
1cbc0 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30  from ticket #350
1cbd0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ..**.**  (13)  T
1cbe0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1cbf0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1cc00 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1cc10 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1cc20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1cc30 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
1cc40 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54  ..**.**  (15)  T
1cc50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1cc60 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
1cc70 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
1cc80 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
1cc90 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1cca0 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20  ot have a LIMIT 
1ccb0 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
1ccc0 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
1ccd0 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b  339 and ticket [
1cce0 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a  02a8e81d44])..**
1ccf0 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f  .**  (16)  The o
1cd00 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1cd10 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
1cd20 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64  r the subquery d
1cd30 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f  oes.**        no
1cd40 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
1cd50 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
1cd60 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
1cd70 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
1cd80 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
1cd90 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
1cda0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
1cdb0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
1cdc0 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71   (17)  The sub-q
1cdd0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f  uery is not a co
1cde0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f  mpound select, o
1cdf0 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20  r it is a UNION 
1ce00 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63  ALL .**        c
1ce10 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d  ompound clause m
1ce20 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20  ade up entirely 
1ce30 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  of non-aggregate
1ce40 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a   queries, and .*
1ce50 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72  *        the par
1ce60 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  ent query:.**.**
1ce70 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1ce80 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f  ot itself part o
1ce90 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
1cea0 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ect,.**         
1ceb0 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67   * is not an agg
1cec0 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e  regate or DISTIN
1ced0 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a  CT query, and.**
1cee0 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1cef0 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20  ot a join.**.** 
1cf00 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
1cf10 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
1cf20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
1cf30 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
1cf40 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
1cf50 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
1cf60 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
1cf70 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1cf80 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
1cf90 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
1cfa0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
1cfb0 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
1cfc0 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
1cfd0 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1cfe0 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
1cff0 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
1d000 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
1d010 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
1d020 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
1d030 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
1d040 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
1d050 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
1d060 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
1d070 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
1d080 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
1d090 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
1d0a0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
1d0b0 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
1d0c0 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
1d0d0 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
1d0e0 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
1d0f0 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
1d100 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
1d110 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1d120 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d130 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
1d140 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
1d150 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1d160 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
1d170 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
1d180 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
1d190 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
1d1a0 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
1d1b0 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
1d1c0 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
1d1d0 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
1d1e0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
1d1f0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1d200 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1d210 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
1d220 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
1d230 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62  *        ORDER b
1d240 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  y clause of the 
1d250 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
1d260 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
1d270 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
1d280 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
1d290 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
1d2a0 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65  (19)  The subque
1d2b0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1d2c0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1d2d0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
1d2e0 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
1d2f0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
1d300 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
1d310 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1d320 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1d330 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
1d340 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
1d350 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
1d360 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
1d370 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
1d380 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
1d390 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
1d3a0 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
1d3b0 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
1d3c0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
1d3d0 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
1d3e0 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
1d3f0 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
1d400 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
1d410 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1d420 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20    But we.**     
1d430 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70     have other op
1d440 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d  timizations in m
1d450 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ind to deal with
1d460 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a   that case..**.*
1d470 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62  *  (21)  The sub
1d480 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1d490 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1d4a0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1d4b0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1d4c0 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
1d4d0 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
1d4e0 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
1d4f0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1d500 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1d510 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29  CTE..**.**  (23)
1d520 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73 20    The parent is 
1d530 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1d540 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62 2d  CTE, or the sub-
1d550 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a  query is not a.*
1d560 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
1d570 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72 65  d query. This re
1d580 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
1d590 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
1d5a0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
1d5b0 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
1d5c0 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
1d5d0 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
1d5e0 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
1d5f0 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
1d600 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
1d610 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
1d620 32 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  24)  The subquer
1d630 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1d640 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20  egate that uses 
1d650 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
1d660 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20  () or .**       
1d670 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
1d680 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74  ons.  (Without t
1d690 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c  his restriction,
1d6a0 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a   a query like:.*
1d6b0 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  *        "SELECT
1d6c0 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
1d6d0 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74  max(y), x FROM t
1d6e0 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65  1)" would not ne
1d6f0 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20  cessarily.**    
1d700 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76      return the v
1d710 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68  alue X for which
1d720 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29   Y was maximal.)
1d730 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  .**.**.** In thi
1d740 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
1d750 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
1d760 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1d770 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
1d780 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1d790 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
1d7a0 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
1d7b0 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
1d7c0 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
1d7d0 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
1d7e0 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
1d7f0 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1d800 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1d810 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
1d820 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
1d830 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
1d840 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1d850 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
1d860 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1d870 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
1d880 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1d890 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
1d8a0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1d8b0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
1d8c0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
1d8d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
1d8e0 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
1d8f0 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
1d900 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
1d910 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
1d920 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
1d930 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1d940 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1d950 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1d960 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1d970 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
1d980 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
1d990 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
1d9a0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
1d9b0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
1d9c0 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
1d9d0 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
1d9e0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
1d9f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1da00 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
1da10 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
1da20 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
1da30 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
1da40 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
1da50 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1da60 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1da70 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
1da80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
1da90 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
1daa0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1dab0 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
1dac0 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75  Parent;    /* Cu
1dad0 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20  rrent UNION ALL 
1dae0 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74 68 65  term of the othe
1daf0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c  r query */.  Sel
1db00 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
1db10 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
1db20 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
1db30 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  " */.  Select *p
1db40 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f  Sub1;      /* Po
1db50 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
1db60 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e  htmost select in
1db70 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20   sub-query */.  
1db80 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
1db90 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
1dba0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1dbb0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
1dbc0 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
1dbd0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
1dbe0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
1dbf0 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
1dc00 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
1dc10 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
1dc20 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1dc30 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
1dc40 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
1dc50 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
1dc60 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
1dc70 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
1dc80 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dca0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1dcb0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1dce0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1dcf0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1dd00 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a   *pSubitem;   /*
1dd10 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
1dd20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1dd30 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
1dd40 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1dd50 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
1dd60 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
1dd70 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
1dd80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  */.  assert( p!=
1dd90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1dda0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20  ->pPrior==0 );  
1ddb0 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61  /* Unable to fla
1ddc0 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75  tten compound qu
1ddd0 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f  eries */.  if( O
1dde0 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
1ddf0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
1de00 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29  ueryFlattener) )
1de10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
1de20 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
1de30 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
1de40 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
1de50 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
1de60 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
1de70 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69  c->a[iFrom];.  i
1de80 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65  Parent = pSubite
1de90 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53  m->iCursor;.  pS
1dea0 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  ub = pSubitem->p
1deb0 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
1dec0 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69  ( pSub!=0 );.  i
1ded0 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
1dee0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67   ){.    if( isAg
1def0 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20  Restriction (1) 
1df30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72    */.    if( pSr
1df40 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
1df50 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1df70 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 61   Restriction (2a
1df80 29 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70  )  */.    if( (p
1df90 2d 3e 70 57 68 65 72 65 20 26 26 20 45 78 70 72  ->pWhere && Expr
1dfa0 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70  HasProperty(p->p
1dfb0 57 68 65 72 65 2c 45 50 5f 53 75 62 71 75 65 72  Where,EP_Subquer
1dfc0 79 29 29 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c  y)).     || (sql
1dfd0 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
1dfe0 73 28 70 2d 3e 70 45 4c 69 73 74 29 20 26 20 45  s(p->pEList) & E
1dff0 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20  P_Subquery)!=0. 
1e000 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45      || (sqlite3E
1e010 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
1e020 70 4f 72 64 65 72 42 79 29 20 26 20 45 50 5f 53  pOrderBy) & EP_S
1e030 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20  ubquery)!=0.    
1e040 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e050 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e080 65 73 74 72 69 63 74 69 6f 6e 20 28 32 62 29 20  estriction (2b) 
1e090 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
1e0a0 20 20 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70    .  pSubSrc = p
1e0b0 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
1e0c0 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
1e0d0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
1e0e0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
1e0f0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1e100 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
1e110 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
1e120 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
1e130 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
1e140 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
1e150 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
1e160 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1e170 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
1e180 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1e190 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1e1a0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
1e1b0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1e1c0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
1e1d0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1e1e0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
1e1f0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
1e200 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
1e210 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
1e220 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1e230 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
1e240 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1e250 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e260 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
1e270 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
1e280 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2a0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e2b0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
1e2c0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1e2d0 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
1e2e0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
1e2f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e330 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
1e340 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1e350 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
1e360 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e380 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
1e390 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1e3a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1e3b0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1e3c0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
1e3d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
1e3e0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1e3f0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
1e400 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
1e410 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
1e420 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1e430 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
1e440 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
1e450 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1e460 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1e470 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
1e480 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
1e490 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1e4a0 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
1e4b0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
1e4c0 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
1e4d0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1e4e0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e510 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1e520 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
1e530 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
1e540 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1e550 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1e560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e570 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
1e580 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1e590 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
1e5a0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
1e5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e5c0 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
1e5d0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1e5e0 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
1e5f0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1e600 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
1e610 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e620 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e630 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 74 65  (21) */.  }.  te
1e640 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65  stcase( pSub->se
1e650 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
1e660 72 73 69 76 65 20 29 3b 0a 20 20 74 65 73 74 63  rsive );.  testc
1e670 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c  ase( pSub->selFl
1e680 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d 61 78 41  ags & SF_MinMaxA
1e690 67 67 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62  gg );.  if( pSub
1e6a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1e6b0 5f 52 65 63 75 72 73 69 76 65 7c 53 46 5f 4d 69  _Recursive|SF_Mi
1e6c0 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20 20 20 20  nMaxAgg) ){.    
1e6d0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1e6e0 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29 20 61  trictions (22) a
1e6f0 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20 7d 0a 20  nd (24) */.  }. 
1e700 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1e710 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1e720 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f  ) && pSub->pPrio
1e730 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1e740 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1e750 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20  n (23) */.  }.. 
1e760 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   /* OBSOLETE COM
1e770 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73  MENT 1:.  ** Res
1e780 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20  triction 3:  If 
1e790 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1e7a0 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  a join, make sur
1e7b0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
1e7c0 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64  s .  ** not used
1e7d0 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   as the right op
1e7e0 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65  erand of an oute
1e7f0 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65  r join.  Example
1e800 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  s of why this.  
1e810 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ** is not allowe
1e820 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
1e830 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
1e840 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
1e850 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
1e860 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
1e870 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
1e880 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
1e890 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
1e8a0 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
1e8b0 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
1e8c0 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
1e8d0 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
1e8e0 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ing..  **.  ** O
1e8f0 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
1e900 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  2:.  ** Restrict
1e910 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
1e920 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1e930 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1e940 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
1e950 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
1e960 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
1e970 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
1e980 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
1e990 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
1e9a0 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
1e9b0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1e9c0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
1e9d0 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
1e9e0 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
1e9f0 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
1ea00 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
1ea10 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
1ea20 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
1ea30 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
1ea40 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
1ea50 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
1ea60 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
1ea70 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
1ea80 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
1ea90 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
1eaa0 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
1eab0 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
1eac0 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
1ead0 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
1eae0 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  OIN..  **.  ** T
1eaf0 48 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42  HIS OVERRIDES OB
1eb00 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20  SOLETE COMMENTS 
1eb10 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20  1 AND 2 ABOVE:. 
1eb20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30   ** Ticket #3300
1eb30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74   shows that flat
1eb40 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74  tening the right
1eb50 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
1eb60 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61  JOIN.  ** is fra
1eb70 75 67 68 74 20 77 69 74 68 20 64 61 6e 67 65 72  ught with danger
1eb80 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64  .  Best to avoid
1eb90 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67   the whole thing
1eba0 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73  .  If the.  ** s
1ebb0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1ebc0 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
1ebd0 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64  EFT JOIN, then d
1ebe0 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20  o not flatten.. 
1ebf0 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
1ec00 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
1ec10 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1ec20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1ec30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
1ec40 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68  iction 17: If th
1ec50 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1ec60 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1ec70 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
1ec80 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
1ec90 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1eca0 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
1ecb0 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
1ecc0 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
1ecd0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
1ece0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1ecf0 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
1ed00 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
1ed10 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
1ed20 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
1ed30 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
1ed40 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
1ed50 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1ed60 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1ed70 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a  Restriction 20 *
1ed80 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
1ed90 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
1eda0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1edb0 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
1edc0 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
1edd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1ede0 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
1edf0 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
1ee00 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
1ee10 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1ee20 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
1ee30 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1ee40 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1ee50 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
1ee60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ee70 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1ee80 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1ee90 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1eea0 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
1eeb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1eec0 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
1eed0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1eee0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
1eef0 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr==pSub1->pELis
1ef00 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1ef10 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
1ef20 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1ef30 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1ef40 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  te))!=0.       |
1ef50 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  | (pSub1->pPrior
1ef60 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54   && pSub1->op!=T
1ef70 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c  K_ALL) .       |
1ef80 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  | pSub1->pSrc->n
1ef90 53 72 63 3c 31 0a 20 20 20 20 20 20 29 7b 0a 20  Src<1.      ){. 
1efa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1efb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1efc0 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
1efd0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
1efe0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1eff0 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f  striction 18. */
1f000 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
1f010 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
1f020 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
1f030 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
1f040 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
1f050 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1f060 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
1f070 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
1f080 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
1f090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f0a0 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66    }..  /***** If
1f0b0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1f0c0 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
1f0d0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
1f0e0 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52  ****/.  SELECTTR
1f0f0 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
1f100 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66  "flatten %s.%p f
1f110 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a  rom term %d\n",.
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d     pSub->zSelNam
1f140 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29  e, pSub, iFrom))
1f150 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a  ;..  /* Authoriz
1f160 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  e the subquery *
1f170 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  /.  pParse->zAut
1f180 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
1f190 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45  tem->zName;.  TE
1f1a0 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69  STONLY(i =) sqli
1f1b0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1f1c0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
1f1d0 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
1f1e0 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c  testcase( i==SQL
1f1f0 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50  ITE_DENY );.  pP
1f200 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1f210 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
1f220 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
1f230 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1f240 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
1f250 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
1f260 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
1f270 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
1f280 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
1f290 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
1f2a0 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
1f2b0 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
1f2c0 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
1f2d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1f2e0 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
1f2f0 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
1f300 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
1f310 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
1f320 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
1f330 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
1f340 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
1f350 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
1f360 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
1f370 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
1f380 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
1f390 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
1f3a0 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
1f3b0 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
1f3c0 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
1f3d0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
1f3e0 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
1f3f0 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
1f400 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
1f410 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
1f420 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
1f430 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
1f440 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
1f450 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
1f460 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
1f470 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
1f480 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
1f490 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
1f4a0 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
1f4b0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
1f4c0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
1f4d0 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1f4e0 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
1f4f0 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1f500 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1f510 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
1f520 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
1f530 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
1f540 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
1f550 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
1f560 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
1f570 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
1f580 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
1f590 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
1f5a0 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
1f5b0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1f5c0 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
1f5d0 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
1f5e0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1f5f0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
1f600 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
1f610 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
1f620 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
1f630 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
1f640 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
1f650 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
1f660 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
1f670 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
1f680 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1f690 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
1f6a0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
1f6b0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
1f6c0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
1f6d0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
1f6e0 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
1f6f0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
1f700 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66  t;.    Expr *pOf
1f710 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
1f720 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
1f730 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
1f740 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
1f750 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
1f760 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
1f770 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
1f780 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
1f790 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
1f7a0 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
1f7b0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
1f7c0 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, p, 0);.    sq
1f7d0 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
1f7e0 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a  me(pNew, pSub->z
1f7f0 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  SelName);.    p-
1f800 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
1f810 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  et;.    p->pLimi
1f820 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
1f830 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1f840 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
1f850 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
1f860 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
1f870 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1f880 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  ){.      p->pPri
1f890 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
1f8a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
1f8b0 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
1f8c0 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ior;.      if( p
1f8d0 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e  Prior ) pPrior->
1f8e0 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
1f8f0 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
1f900 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  = p;.      p->pP
1f910 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
1f920 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32     SELECTTRACE(2
1f930 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20  ,pParse,p,.     
1f940 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73      ("compound-s
1f950 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65  ubquery flattene
1f960 72 20 63 72 65 61 74 65 73 20 25 73 2e 25 70 20  r creates %s.%p 
1f970 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20  as peer\n",.    
1f980 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e       pNew->zSelN
1f990 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20  ame, pNew));.   
1f9a0 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
1f9b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1f9c0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1f9d0 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69  * Begin flatteni
1f9e0 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20  ng the iFrom-th 
1f9f0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
1fa00 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69  M clause .  ** i
1fa10 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fa20 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  y..  */.  pSub =
1fa30 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65   pSub1 = pSubite
1fa40 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  m->pSelect;..  /
1fa50 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61  * Delete the tra
1fa60 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
1fa70 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
1fa80 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
1fa90 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  subquery.  */.  
1faa0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1fab0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  , pSubitem->zDat
1fac0 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  abase);.  sqlite
1fad0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1fae0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
1faf0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1fb00 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  , pSubitem->zAli
1fb10 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  as);.  pSubitem-
1fb20 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
1fb30 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d    pSubitem->zNam
1fb40 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
1fb50 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->zAlias = 0;. 
1fb60 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1fb70 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65  ct = 0;..  /* De
1fb80 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  fer deleting the
1fb90 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73   Table object as
1fba0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1fbb0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1fbc0 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72  until code gener
1fbd0 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ation is.  ** co
1fbe0 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68  mplete, since th
1fbf0 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78  ere may still ex
1fc00 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e  ist Expr.pTab en
1fc10 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  tries that.  ** 
1fc20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62  refer to the sub
1fc30 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72  query even after
1fc40 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69   flattening.  Ti
1fc50 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a  cket #3346..  **
1fc60 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e  .  ** pSubitem->
1fc70 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e  pTab is always n
1fc80 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20  on-NULL by test 
1fc90 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64  restrictions and
1fca0 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20   tests above..  
1fcb0 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
1fcc0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d  pSubitem->pTab!=
1fcd0 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  0) ){.    Table 
1fce0 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75  *pTabToDel = pSu
1fcf0 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bitem->pTab;.   
1fd00 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e   if( pTabToDel->
1fd10 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nRef==1 ){.     
1fd20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1fd30 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1fd40 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1fd50 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
1fd60 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
1fd70 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
1fd80 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
1fd90 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1fda0 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
1fdb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fdc0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65    pTabToDel->nRe
1fdd0 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f--;.    }.    p
1fde0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
1fdf0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
1fe00 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
1fe10 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
1fe20 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d  ch term in a com
1fe30 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20  pound-subquery. 
1fe40 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28   ** flattening (
1fe50 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
1fe60 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  ve).  If we are 
1fe70 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  doing a differen
1fe80 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66  t kind.  ** of f
1fe90 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c  lattening - a fl
1fea0 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74  attening other t
1feb0 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  han a compound-s
1fec0 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
1fed0 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ng -.  ** then t
1fee0 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
1fef0 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  ns once..  **.  
1ff00 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76  ** This loop mov
1ff10 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  es all of the FR
1ff20 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
1ff30 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1ff40 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
1ff50 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1ff60 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1ff70 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
1ff80 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
1ff90 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
1ffa0 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
1ffb0 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
1ffc0 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
1ffd0 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
1ffe0 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
1fff0 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
20000 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
20010 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
20020 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
20030 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
20040 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
20050 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
20060 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
20070 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
20080 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
20090 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
200a0 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
200b0 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
200c0 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
200d0 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
200e0 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
200f0 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
20100 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
20110 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
20120 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f  ubSrc;.    u8 jo
20130 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
20140 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
20150 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
20160 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  M clause of subq
20170 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62  uery */.    nSub
20180 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
20190 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  Src;  /* Number 
201a0 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71  of terms in subq
201b0 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
201c0 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70   */.    pSrc = p
201d0 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20  Parent->pSrc;   
201e0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
201f0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
20200 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ery */..    if( 
20210 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73  pSrc ){.      as
20220 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70  sert( pParent==p
20230 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69   );  /* First ti
20240 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  me through the l
20250 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69  oop */.      joi
20260 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
20270 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  ->fg.jointype;. 
20280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20290 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
202a0 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e  =p );  /* 2nd an
202b0 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d  d subsequent tim
202c0 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  es through the l
202d0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72  oop */.      pSr
202e0 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
202f0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
20300 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
20310 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
20320 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
20330 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
20340 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
20350 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20370 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
20380 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  y uses a single 
20390 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  slot of the FROM
203a0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
203b0 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72  uter.    ** quer
203c0 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75  y.  If the subqu
203d0 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61  ery has more tha
203e0 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e  n one element in
203f0 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
20400 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78  ,.    ** then ex
20410 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
20420 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61  uery to make spa
20430 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c  ce for it to hol
20440 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20  d all elements. 
20450 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62     ** of the sub
20460 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
20470 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
20480 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
20490 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
204a0 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  A, (SELECT * FRO
204b0 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74  M sub1, sub2), t
204c0 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  abB;.    **.    
204d0 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  ** The outer que
204e0 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69  ry has 3 slots i
204f0 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
20500 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20  e.  One slot of 
20510 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
20520 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64   query (the midd
20530 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64  le slot) is used
20540 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79   by the subquery
20550 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  .  The next.    
20560 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ** block of code
20570 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65   will expand the
20580 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
20590 4d 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c  M clause to 4 sl
205a0 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ots..    ** The 
205b0 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65  middle slot is e
205c0 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
205d0 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
205e0 20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20   make space.    
205f0 2a 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65  ** for the two e
20600 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
20610 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
20620 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
20630 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
20640 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
20650 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
20660 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
20670 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
20680 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
20690 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
206a0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
206b0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
206c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
206d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
206e0 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
206f0 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
20700 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
20710 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
20720 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
20730 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20740 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
20750 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
20760 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
20770 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
20780 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73  sing);.      ass
20790 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69  ert( pSrc->a[i+i
207a0 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75  From].fg.isTabFu
207b0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  nc==0 );.      p
207c0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
207d0 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
207e0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
207f0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
20800 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
20810 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
20820 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
20830 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
20840 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20  jointype;.  .   
20850 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75   /* Now begin su
20860 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75  bstituting subqu
20870 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65  ery result set e
20880 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a  xpressions for .
20890 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
208a0 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74  s to the iParent
208b0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
208c0 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ery..    ** .   
208d0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
208e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
208f0 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
20900 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
20910 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
20920 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
20930 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20  b;.    **   \   
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20950 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
20960 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
20970 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f  ____/          /
20980 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f  .    **    \____
20990 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
209a0 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
209b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
209c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
209d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c    **.    ** We l
209e0 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70  ook at every exp
209f0 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f  ression in the o
20a00 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65  uter query and e
20a10 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
20a20 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20  e.    ** "a" we 
20a30 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
20a40 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
20a50 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
20a60 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
20a70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69  ..    */.    pLi
20a80 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45  st = pParent->pE
20a90 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
20aa0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
20ab0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
20ac0 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
20ad0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
20ae0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
20af0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
20b00 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
20b10 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20  .zSpan);.       
20b20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
20b30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
20b40 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
20b50 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
20b60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
20b70 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
20b80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74  ){.      /* At t
20b90 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e  his point, any n
20ba0 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42 79  on-zero iOrderBy
20bb0 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64 69 63  Col values indic
20bc0 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ate that the.   
20bd0 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 63     ** ORDER BY c
20be0 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
20bf0 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f   is identical to
20c00 20 74 68 65 20 69 4f 72 64 65 72 42 79 43 6f 6c   the iOrderByCol
20c10 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  'th.      ** exp
20c20 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64  ression returned
20c30 20 62 79 20 53 45 4c 45 43 54 20 73 74 61 74 65   by SELECT state
20c40 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e 63 65  ment pSub. Since
20c50 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a 20 20   these values.  
20c60 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65      ** do not ne
20c70 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65 73  cessarily corres
20c80 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  pond to columns 
20c90 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  in SELECT statem
20ca0 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20 20 20  ent pParent,.   
20cb0 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20     ** zero them 
20cc0 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72 69  before transferi
20cd0 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
20ce0 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  clause..      **
20cf0 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f  .      ** Not do
20d00 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63 61 75  ing this may cau
20d10 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  se an error if a
20d20 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
20d30 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a   to this.      *
20d40 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  * function attem
20d50 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  pts to flatten a
20d60 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
20d70 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ery into pParent
20d80 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 6f  .      ** (the o
20d90 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63 61 6e  nly way this can
20da0 20 68 61 70 70 65 6e 20 69 73 20 69 66 20 74 68   happen is if th
20db0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  e compound sub-q
20dc0 75 65 72 79 20 69 73 0a 20 20 20 20 20 20 2a 2a  uery is.      **
20dd0 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20   currently part 
20de0 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29 2e 20  of pSub->pSrc). 
20df0 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31 31 61  See ticket [d11a
20e00 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20  6e908f].  */.   
20e10 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
20e20 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
20e30 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 66 6f  rderBy;.      fo
20e40 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
20e50 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
20e60 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
20e70 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
20e80 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rByCol = 0;.    
20e90 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
20ea0 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
20eb0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
20ec0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 50  assert( pSub->pP
20ed0 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rior==0 );.     
20ee0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
20ef0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
20f00 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
20f10 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rBy = 0;.    }. 
20f20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
20f30 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
20f40 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
20f50 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72  .    if( subquer
20f60 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20  yIsAgg ){.      
20f70 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
20f80 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
20f90 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
20fa0 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d  aving = pParent-
20fb0 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70  >pWhere;.      p
20fc0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
20fd0 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70   pWhere;.      p
20fe0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
20ff0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
21000 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
21010 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20  aving, .        
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21030 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21040 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
21050 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29 3b  b->pHaving, 0));
21060 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21070 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
21080 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
21090 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d  rent->pGroupBy =
210a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
210b0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47  Dup(db, pSub->pG
210c0 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20  roupBy, 0);.    
210d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
210e0 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
210f0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
21100 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
21110 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20  e, pWhere);.    
21120 7d 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65 63  }.    substSelec
21130 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2c 20 69  t(db, pParent, i
21140 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
21150 4c 69 73 74 2c 20 30 29 3b 0a 20 20 0a 20 20 20  List, 0);.  .   
21160 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
21170 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
21180 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
21190 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
211a0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
211b0 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
211c0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
211d0 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
211e0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
211f0 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
21200 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
21210 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
21220 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
21230 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
21240 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
21250 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
21260 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
21270 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
21280 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
21290 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
212a0 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
212b0 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
212c0 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
212d0 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
212e0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
212f0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
21300 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
21310 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
21320 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
21330 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
21340 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
21350 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
21360 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
21370 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
21380 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
21390 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
213a0 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
213b0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
213c0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
213d0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
213e0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
213f0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
21400 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
21410 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c  ter flattening:\
21420 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
21430 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
21440 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
21450 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31  ndif..  return 1
21460 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
21470 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
21480 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
21490 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
214a0 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a  OMIT_VIEW) */...
214b0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
214c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
214d0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
214e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
214f0 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70  )./*.** Make cop
21500 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20  ies of relevant 
21510 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
21520 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ms of the outer 
21530 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68  query into.** th
21540 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
21550 66 20 73 75 62 71 75 65 72 79 2e 20 20 45 78 61  f subquery.  Exa
21560 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  mple:.**.**    S
21570 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
21580 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64  LECT a AS x, c-d
21590 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57   AS y FROM t1) W
215a0 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31  HERE x=5 AND y=1
215b0 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f  0;.**.** Transfo
215c0 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a  rmed into:.**.**
215d0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
215e0 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
215f0 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
21600 74 31 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44  t1 WHERE a=5 AND
21610 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20   c-d=10).**     
21620 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d  WHERE x=5 AND y=
21630 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f  10;.**.** The ho
21640 70 65 20 69 73 20 74 68 61 74 20 74 68 65 20 74  pe is that the t
21650 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68  erms added to th
21660 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69  e inner query wi
21670 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a  ll make it more.
21680 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  ** efficient..**
21690 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d  .** Do not attem
216a0 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  pt this optimiza
216b0 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tion if:.**.**  
216c0 20 28 31 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (1) The inner q
216d0 75 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65  uery is an aggre
216e0 67 61 74 65 2e 20 20 28 49 6e 20 74 68 61 74 20  gate.  (In that 
216f0 63 61 73 65 2c 20 77 65 27 64 20 72 65 61 6c 6c  case, we'd reall
21700 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20 20 20  y want.**       
21710 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 75 74 65  to copy the oute
21720 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74  r WHERE-clause t
21730 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 48 41  erms onto the HA
21740 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  VING clause of t
21750 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 6e 65  he.**       inne
21760 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 74 68  r query.  But th
21770 65 79 20 70 72 6f 62 61 62 6c 79 20 77 6f 6e 27  ey probably won'
21780 74 20 68 65 6c 70 20 74 68 65 72 65 20 73 6f 20  t help there so 
21790 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e 29 0a  do not bother.).
217a0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20  **.**   (2) The 
217b0 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74  inner query is t
217c0 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72  he recursive par
217d0 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61  t of a common ta
217e0 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ble expression..
217f0 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20  **.**   (3) The 
21800 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73 20  inner query has 
21810 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28  a LIMIT clause (
21820 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65  since the change
21830 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a  s to the WHERE.*
21840 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f  *       close wo
21850 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d  uld change the m
21860 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49  eaning of the LI
21870 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34  MIT)..**.**   (4
21880 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
21890 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
218a0 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54  perand of a LEFT
218b0 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63 61 6c   JOIN.  (The cal
218c0 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66  ler.**       enf
218d0 6f 72 63 65 73 20 74 68 69 73 20 72 65 73 74 72  orces this restr
218e0 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74 68 69  iction since thi
218f0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
21900 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a  ot have enough.*
21910 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74  *       informat
21920 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a  ion to know.).**
21930 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48  .**   (5) The WH
21940 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
21950 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73  ssion originates
21960 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
21970 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ING clause.**   
21980 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f      of a LEFT JO
21990 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  IN..**.** Return
219a0 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73   0 if no changes
219b0 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f   are made and no
219c0 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72  n-zero if one or
219d0 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75   more WHERE clau
219e0 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20  se.** terms are 
219f0 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20  duplicated into 
21a00 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
21a10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75 73 68  .static int push
21a20 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a  DownWhereTerms(.
21a30 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
21a40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
21a50 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21a60 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29  on (for malloc()
21a70 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  ) */.  Select *p
21a80 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a 20  Subq,        /* 
21a90 54 68 65 20 73 75 62 71 75 65 72 79 20 77 68 6f  The subquery who
21aa0 73 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  se WHERE clause 
21ab0 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e 74  is to be augment
21ac0 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
21ad0 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
21ae0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
21af0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
21b00 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43  uery */.  int iC
21b10 75 72 73 6f 72 20 20 20 20 20 20 20 20 20 20 20  ursor           
21b20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
21b30 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
21b40 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
21b50 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67  New;.  int nChng
21b60 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
21b70 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
21b80 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
21b90 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  r compound SELEC
21ba0 54 73 20 69 6e 20 70 53 75 62 71 20 2a 2f 0a 20  Ts in pSubq */. 
21bb0 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29   if( pWhere==0 )
21bc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
21bd0 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70  (pX=pSubq; pX; p
21be0 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  X=pX->pPrior){. 
21bf0 20 20 20 69 66 28 20 28 70 58 2d 3e 73 65 6c 46     if( (pX->selF
21c00 6c 61 67 73 20 26 20 28 53 46 5f 41 67 67 72 65  lags & (SF_Aggre
21c10 67 61 74 65 7c 53 46 5f 52 65 63 75 72 73 69 76  gate|SF_Recursiv
21c20 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))!=0 ){.      
21c30 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 73 65  testcase( pX->se
21c40 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
21c50 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 74  egate );.      t
21c60 65 73 74 63 61 73 65 28 20 70 58 2d 3e 73 65 6c  estcase( pX->sel
21c70 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
21c80 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20 74 65  sive );.      te
21c90 73 74 63 61 73 65 28 20 70 58 21 3d 70 53 75 62  stcase( pX!=pSub
21ca0 71 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  q );.      retur
21cb0 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
21cc0 69 6f 6e 73 20 28 31 29 20 61 6e 64 20 28 32 29  ions (1) and (2)
21cd0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
21ce0 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69  if( pSubq->pLimi
21cf0 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t!=0 ){.    retu
21d00 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
21d10 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a  tion (3) */.  }.
21d20 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d    while( pWhere-
21d30 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
21d40 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68     nChng += push
21d50 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 64  DownWhereTerms(d
21d60 62 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65  b, pSubq, pWhere
21d70 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73 6f  ->pRight, iCurso
21d80 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  r);.    pWhere =
21d90 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a   pWhere->pLeft;.
21da0 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61    }.  if( ExprHa
21db0 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
21dc0 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20  ,EP_FromJoin) ) 
21dd0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
21de0 74 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a 20 20  triction 5 */.  
21df0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
21e00 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70  sTableConstant(p
21e10 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20  Where, iCursor) 
21e20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a  ){.    nChng++;.
21e30 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71      while( pSubq
21e40 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
21e50 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
21e60 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  db, pWhere, 0);.
21e70 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62        pNew = sub
21e80 73 74 45 78 70 72 28 64 62 2c 20 70 4e 65 77 2c  stExpr(db, pNew,
21e90 20 69 43 75 72 73 6f 72 2c 20 70 53 75 62 71 2d   iCursor, pSubq-
21ea0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
21eb0 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20  pSubq->pWhere = 
21ec0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
21ed0 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65  b, pSubq->pWhere
21ee0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  , pNew);.      p
21ef0 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50  Subq = pSubq->pP
21f00 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rior;.    }.  }.
21f10 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a    return nChng;.
21f20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
21f30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21f40 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
21f50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
21f60 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
21f70 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
21f80 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
21f90 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
21fa0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
21fb0 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
21fc0 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
21fd0 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
21fe0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
21ff0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
22000 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
22010 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
22020 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
22030 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
22040 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
22050 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
22060 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
22070 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
22080 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
22090 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
220a0 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
220b0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
220c0 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
220d0 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
220e0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
220f0 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
22100 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
22110 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
22120 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
22130 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
22140 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
22150 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
22160 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
22170 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
22180 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
22190 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
221a0 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
221b0 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
221c0 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
221d0 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
221e0 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
221f0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
22200 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
22210 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
22220 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
22230 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
22240 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
22250 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
22260 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
22270 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
22280 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
22290 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
222a0 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
222b0 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
222c0 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
222d0 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
222e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
222f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
22300 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
22310 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
22320 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
22330 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
22340 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
22350 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
22360 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
22370 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
22380 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
22390 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
223a0 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
223b0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
223c0 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
223d0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
223e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
223f0 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
22400 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
22410 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
22420 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
22430 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
22440 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
22450 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
22460 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
22470 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
22480 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
22490 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
224a0 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
224b0 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
224c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
224d0 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
224e0 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
224f0 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
22500 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
22510 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
22520 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
22530 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
22540 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
22550 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
22560 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
22570 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61  rgument is the a
22580 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
22590 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
225a0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
225b0 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
225c0 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
225d0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
225e0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
225f0 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
22600 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
22610 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
22620 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
22630 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
22640 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
22650 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
22660 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
22670 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
22680 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
22690 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
226a0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
226b0 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
226c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
226d0 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
226e0 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
226f0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
22700 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
22710 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
22720 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
22730 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
22740 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
22750 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
22760 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
22770 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
22780 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
22790 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
227a0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
227b0 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
227c0 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
227d0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
227e0 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
227f0 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
22800 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
22810 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
22820 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
22830 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
22840 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
22850 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
22860 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
22870 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
22880 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
22890 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
228a0 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
228b0 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
228c0 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
228d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
228e0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
228f0 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
22900 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
22910 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
22920 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
22930 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
22940 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
22950 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
22960 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
22970 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
22980 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
22990 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
229a0 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
229b0 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
229c0 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
229d0 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
229e0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
229f0 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
22a00 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
22a10 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
22a20 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
22a30 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
22a40 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
22a50 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
22a60 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
22a70 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
22a80 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
22a90 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
22aa0 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
22ab0 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
22ac0 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
22ad0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
22ae0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
22af0 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65  .    char *zInde
22b00 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75  xedBy = pFrom->u
22b10 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20  1.zIndexedBy;.  
22b20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
22b30 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
22b40 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
22b50 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
22b60 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
22b70 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42  zName, zIndexedB
22b80 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  y); .        pId
22b90 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
22ba0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
22bb0 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
22bc0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22bd0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
22be0 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65  ex: %s", zIndexe
22bf0 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dBy, 0);.      p
22c00 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
22c10 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
22c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
22c30 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
22c40 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  om->pIBIndex = p
22c50 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
22c60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
22c70 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70  *.** Detect comp
22c80 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
22c90 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20  ements that use 
22ca0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
22cb0 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61  se with .** an a
22cc0 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
22cd0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
22ce0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e  *.**    SELECT .
22cf0 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
22d00 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
22d10 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e  M t2 ORDER BY ..
22d20 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
22d30 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77  ** These are rew
22d40 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71  ritten as a subq
22d50 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  uery:.**.**    S
22d60 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
22d70 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
22d80 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
22d90 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20  .. FROM t2).**  
22da0 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20     ORDER BY ... 
22db0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
22dc0 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
22dd0 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
22de0 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  ry because the m
22df0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
22e00 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  y() routine.** a
22e10 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61  bove that genera
22e20 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
22e30 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
22e40 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
22e50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73   BY clause.** us
22e60 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72  es a merge algor
22e70 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72  ithm that requir
22e80 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
22e90 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
22ea0 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  n the.** result 
22eb0 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68  columns as on th
22ec0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
22ed0 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a  e.  See ticket.*
22ee0 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  * http://www.sql
22ef0 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
22f00 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a  /6709574d2a.**.*
22f10 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
22f20 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65  ation is only ne
22f30 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c  eded for EXCEPT,
22f40 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20   INTERSECT, and 
22f50 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e  UNION..** The UN
22f60 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
22f70 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68   works fine with
22f80 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
22f90 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a  rBy() even when.
22fa0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c  ** there are COL
22fb0 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68  LATE terms in th
22fc0 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73  e ORDER BY..*/.s
22fd0 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72  tatic int conver
22fe0 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
22ff0 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72  oSubquery(Walker
23000 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
23010 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t *p){.  int i;.
23020 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
23030 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20    Select *pX;.  
23040 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
23050 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
23060 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73  tem *a;.  SrcLis
23070 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61  t *pNewSrc;.  Pa
23080 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54  rse *pParse;.  T
23090 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69  oken dummy;..  i
230a0 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
230b0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
230c0 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e  tinue;.  if( p->
230d0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
230e0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
230f0 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70  e;.  for(pX=p; p
23100 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b  X && (pX->op==TK
23110 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  _ALL || pX->op==
23120 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70  TK_SELECT); pX=p
23130 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69  X->pPrior){}.  i
23140 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72  f( pX==0 ) retur
23150 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23160 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42    a = p->pOrderB
23170 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  y->a;.  for(i=p-
23180 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
23190 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
231a0 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78      if( a[i].pEx
231b0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  pr->flags & EP_C
231c0 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a  ollate ) break;.
231d0 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20    }.  if( i<0 ) 
231e0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
231f0 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  nue;..  /* If we
23200 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
23210 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
23220 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
23230 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
23240 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ..  pParse = pWa
23250 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
23260 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
23270 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
23280 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
23290 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
232a0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
232b0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
232c0 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ort;.  memset(&d
232d0 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ummy, 0, sizeof(
232e0 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53  dummy));.  pNewS
232f0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
23300 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
23310 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26  m(pParse,0,0,0,&
23320 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b  dummy,pNew,0,0);
23330 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d  .  if( pNewSrc==
23340 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
23350 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20  bort;.  *pNew = 
23360 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20  *p;.  p->pSrc = 
23370 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45  pNewSrc;.  p->pE
23380 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
23390 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
233a0 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
233b0 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52  xpr(db, TK_ASTER
233c0 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f  ISK, 0));.  p->o
233d0 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
233e0 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a   p->pWhere = 0;.
233f0 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
23400 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48   = 0;.  pNew->pH
23410 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65  aving = 0;.  pNe
23420 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  w->pOrderBy = 0;
23430 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
23440 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30  ;.  p->pNext = 0
23450 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30  ;.  p->pWith = 0
23460 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
23470 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
23480 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
23490 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e  elFlags & SF_Con
234a0 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20  verted)==0 );.  
234b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
234c0 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61  F_Converted;.  a
234d0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72  ssert( pNew->pPr
234e0 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  ior!=0 );.  pNew
234f0 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ->pPrior->pNext 
23500 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
23510 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  pLimit = 0;.  pN
23520 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b  ew->pOffset = 0;
23530 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
23540 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
23550 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23560 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23570 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20   term pFrom has 
23580 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
23590 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e  ction.** argumen
235a0 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ts.  If it does,
235b0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
235c0 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
235d0 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  e and return.** 
235e0 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20  non-zero, since 
235f0 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c  pFrom is not all
23600 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62  owed to be a tab
23610 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
23620 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
23630 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  t cannotBeFuncti
23640 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
23650 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
23660 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
23670 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
23680 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
23690 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
236a0 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73  pParse, "'%s' is
236b0 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22   not a function"
236c0 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pFrom->zName);
236d0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
236e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
236f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23700 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
23710 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28  Argument pWith (
23720 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c  which may be NUL
23730 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c  L) points to a l
23740 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65  inked list of ne
23750 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f  sted .** WITH co
23760 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e  ntexts, from inn
23770 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e  er to outermost.
23780 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64   If the table id
23790 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  entified by .** 
237a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
237b0 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61  ent pItem is rea
237c0 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62  lly a common-tab
237d0 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43  le-expression (C
237e0 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74  TE) .** then ret
237f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
23800 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74   the CTE definit
23810 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62  ion for that tab
23820 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  le. Otherwise.**
23830 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
23840 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c  .** If a non-NUL
23850 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  L value is retur
23860 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74  ned, set *ppCont
23870 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ext to point to 
23880 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65  the With.** obje
23890 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ct that the retu
238a0 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73  rned CTE belongs
238b0 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73   to..*/.static s
238c0 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63  truct Cte *searc
238d0 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70  hWith(.  With *p
238e0 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
238f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
23900 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49  ent innermost WI
23910 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  TH clause */.  s
23920 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23930 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f  em *pItem,     /
23940 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
23950 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65  ement to resolve
23960 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43   */.  With **ppC
23970 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20  ontext          
23980 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49        /* OUT: WI
23990 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  TH clause return
239a0 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74   value belongs t
239b0 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  o */.){.  const 
239c0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
239d0 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
239e0 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65  ase==0 && (zName
239f0 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29   = pItem->zName)
23a00 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  !=0 ){.    With 
23a10 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57  *p;.    for(p=pW
23a20 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75  ith; p; p=p->pOu
23a30 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ter){.      int 
23a40 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
23a50 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b  ; i<p->nCte; i++
23a60 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
23a70 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
23a80 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  ame, p->a[i].zNa
23a90 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
23aa0 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d      *ppContext =
23ab0 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   p;.          re
23ac0 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  turn &p->a[i];. 
23ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23af0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn 0;.}../* The
23b00 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
23b10 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63  maintains a stac
23b20 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48  k of active WITH
23b30 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68   clauses.** with
23b40 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
23b50 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e  WITH clause bein
23b60 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  g at the top of 
23b70 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
23b80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
23b90 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c  shes the WITH cl
23ba0 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74  ause passed as t
23bb0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
23bc0 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74  nt.** onto the t
23bd0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
23be0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72   If argument bFr
23bf0 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ee is true, then
23c00 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c   this.** WITH cl
23c10 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  ause will never 
23c20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  be popped from t
23c30 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69  he stack. In thi
23c40 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f  s case it.** sho
23c50 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f  uld be freed alo
23c60 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73  ng with the Pars
23c70 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68  e object. In oth
23c80 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a  er cases, when.*
23c90 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20  * bFree==0, the 
23ca0 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c  With object will
23cb0 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
23cc0 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20  with the SELECT 
23cd0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69  .** statement wi
23ce0 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61  th which it is a
23cf0 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f  ssociated..*/.vo
23d00 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  id sqlite3WithPu
23d10 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
23d20 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75  , With *pWith, u
23d30 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65  8 bFree){.  asse
23d40 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20  rt( bFree==0 || 
23d50 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d  (pParse->pWith==
23d60 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69  0 && pParse->pWi
23d70 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a  thToFree==0) );.
23d80 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
23d90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
23da0 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20  e->pWith!=pWith 
23db0 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f  );.    pWith->pO
23dc0 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70  uter = pParse->p
23dd0 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
23de0 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
23df0 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
23e00 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f   pParse->pWithTo
23e10 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20  Free = pWith;.  
23e20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
23e30 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
23e40 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f  if argument pFro
23e50 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54  m refers to a CT
23e60 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a  E declared by .*
23e70 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20  * a WITH clause 
23e80 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72  on the stack cur
23e90 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65  rently maintaine
23ea0 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
23eb0 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72   And,.** if curr
23ec0 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
23ed0 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f   a CTE expressio
23ee0 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  n, if it is a re
23ef0 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72  cursive.** refer
23f00 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72  ence to the curr
23f10 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49  ent CTE..**.** I
23f20 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e  f pFrom falls in
23f30 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  to either of the
23f40 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20   two categories 
23f50 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54  above, pFrom->pT
23f60 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  ab.** and other 
23f70 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c  fields are popul
23f80 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
23f90 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  . The caller sho
23fa0 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46  uld check.** (pF
23fb0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f  rom->pTab!=0) to
23fc0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
23fd0 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63  er or not a succ
23fe0 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20  essful match.** 
23ff0 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  was found..**.**
24000 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
24010 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
24020 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
24030 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
24040 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49  ror.** occurs. I
24050 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
24060 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20  occur, an error 
24070 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65  message is store
24080 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73  d in the.** pars
24090 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f  er and some erro
240a0 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
240b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  n SQLITE_OK retu
240c0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
240d0 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a  int withExpand(.
240e0 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65    Walker *pWalke
240f0 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63  r, .  struct Src
24100 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
24110 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
24120 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
24130 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
24140 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
24150 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20  b;.  struct Cte 
24160 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20  *pCte;          
24170 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20       /* Matched 
24180 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20  CTE (or NULL if 
24190 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57  no match) */.  W
241a0 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20  ith *pWith;     
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
241c0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68  * WITH clause th
241d0 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20  at pCte belongs 
241e0 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
241f0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
24200 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61  );..  pCte = sea
24210 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e  rchWith(pParse->
24220 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70  pWith, pFrom, &p
24230 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74  With);.  if( pCt
24240 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  e ){.    Table *
24250 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69  pTab;.    ExprLi
24260 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
24270 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
24280 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b    Select *pLeft;
24290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242a0 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  /* Left-most SEL
242b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
242c0 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63  .    int bMayRec
242d0 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20  ursive;         
242e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
242f0 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79  mpound joined by
24300 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a   UNION [ALL] */.
24310 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64      With *pSaved
24320 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
24330 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
24340 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57  ue of pParse->pW
24350 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ith */..    /* I
24360 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  f pCte->zCteErr 
24370 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74  is non-NULL at t
24380 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
24390 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67  this is an illeg
243a0 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73  al.    ** recurs
243b0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ive reference to
243c0 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65   CTE pCte. Leave
243d0 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
243e0 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  rse and return. 
243f0 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20     ** early. If 
24400 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73  pCte->zCteErr is
24410 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
24420 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
24430 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20  ive reference.. 
24440 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
24450 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f  se, proceed.  */
24460 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a  .    if( pCte->z
24470 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20  CteErr ){.      
24480 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24490 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43  pParse, pCte->zC
244a0 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61  teErr, pCte->zNa
244b0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
244c0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
244d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61      }.    if( ca
244e0 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70  nnotBeFunction(p
244f0 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20  Parse, pFrom) ) 
24500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24510 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ROR;..    assert
24520 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
24530 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70   );.    pFrom->p
24540 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
24550 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
24560 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
24570 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  e));.    if( pTa
24580 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
24590 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61  C_Abort;.    pTa
245a0 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
245b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
245c0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
245d0 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
245e0 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
245f0 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d   = -1;.    pTab-
24600 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
24610 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
24620 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
24630 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54  48576) );.    pT
24640 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
24650 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54  TF_Ephemeral | T
24660 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
24670 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65  ;.    pFrom->pSe
24680 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
24690 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65  lectDup(db, pCte
246a0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
246b0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
246c0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
246d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
246e0 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
246f0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
24700 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
24710 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
24720 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
24730 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
24740 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
24750 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
24760 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
24770 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
24780 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
24790 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
247a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
247b0 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
247c0 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
247d0 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
247e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
247f0 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
24800 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
24810 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
24820 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
24830 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
24840 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
24850 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
24860 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
24870 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
24880 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
24890 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
248a0 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
248b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
248c0 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
248d0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
248e0 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  em->fg.isRecursi
248f0 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ve = 1;.        
24900 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
24910 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
24920 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
24930 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
24940 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24950 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
24960 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
24970 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
24980 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
24990 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b   pTab->nRef>2 ){
249a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
249b0 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20  rorMsg(.        
249c0 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69    pParse, "multi
249d0 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
249e0 6f 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  o recursive tabl
249f0 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e  e: %s", pCte->zN
24a00 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
24a10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24a20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
24a30 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
24a40 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65  nRef==1 || ((pSe
24a50 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52  l->selFlags&SF_R
24a60 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61  ecursive) && pTa
24a70 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  b->nRef==2 ));..
24a80 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
24a90 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
24aa0 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
24ab0 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
24ac0 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
24ad0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
24ae0 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c  = pWith;.    sql
24af0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
24b00 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75  Walker, bMayRecu
24b10 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50  rsive ? pSel->pP
24b20 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 20 20  rior : pSel);.  
24b30 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
24b40 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f  = pWith;..    fo
24b50 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c  r(pLeft=pSel; pL
24b60 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65  eft->pPrior; pLe
24b70 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  ft=pLeft->pPrior
24b80 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  );.    pEList = 
24b90 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  pLeft->pEList;. 
24ba0 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f     if( pCte->pCo
24bb0 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ls ){.      if( 
24bc0 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
24bd0 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70  ->nExpr!=pCte->p
24be0 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  Cols->nExpr ){. 
24bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
24c00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24c10 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20  table %s has %d 
24c20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
24c30 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20  lumns",.        
24c40 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c      pCte->zName,
24c50 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
24c60 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
24c70 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  pr.        );.  
24c80 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
24c90 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
24ca0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
24cb0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
24cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c       }.      pEL
24cd0 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c  ist = pCte->pCol
24ce0 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  s;.    }..    sq
24cf0 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
24d00 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
24d10 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e   pEList, &pTab->
24d20 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
24d30 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  l);.    if( bMay
24d40 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
24d50 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c     if( pSel->sel
24d60 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
24d70 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
24d80 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
24d90 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
24da0 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
24db0 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
24dc0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
24dd0 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72  zCteErr = "recur
24de0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
24df0 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
24e00 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
24e10 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
24e20 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
24e30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
24e40 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e->zCteErr = 0;.
24e50 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
24e60 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
24e70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
24e80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
24e90 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
24ea0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
24eb0 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
24ec0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
24ed0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
24ee0 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
24ef0 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
24f00 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
24f10 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
24f20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
24f30 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
24f40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
24f50 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
24f60 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
24f70 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
24f80 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
24f90 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
24fa0 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
24fb0 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
24fc0 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
24fd0 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
24fe0 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
24ff0 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
25000 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
25010 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
25020 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
25030 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
25040 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a  pParse;.  With *
25050 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
25060 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
25070 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20  .  if( pWith!=0 
25080 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
25090 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
250a0 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73  ith );.    pPars
250b0 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
250c0 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a  ->pOuter;.  }.}.
250d0 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65  #else.#define se
250e0 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65  lectPopWith 0.#e
250f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
25100 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
25110 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
25120 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
25130 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25140 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
25150 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
25160 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
25170 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
25180 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
25190 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
251a0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
251b0 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
251c0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
251d0 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
251e0 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
251f0 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
25200 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
25210 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
25220 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
25230 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
25240 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
25250 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
25260 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
25270 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
25280 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
25290 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
252a0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
252b0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
252c0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
252d0 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
252e0 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
252f0 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
25300 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
25310 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
25320 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
25330 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
25340 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
25350 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
25360 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
25370 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69  ing up the persi
25380 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
25390 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
253a0 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
253b0 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
253c0 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
253d0 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
253e0 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  mmodate the NATU
253f0 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
25400 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
25410 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
25420 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
25430 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
25440 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
25450 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
25460 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
25470 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
25480 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
25490 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
254a0 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
254b0 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
254c0 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
254d0 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
254e0 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
254f0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
25500 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
25510 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
25520 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
25530 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
25540 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
25550 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
25560 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
25570 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
25580 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
25590 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
255a0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
255b0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
255c0 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
255d0 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
255e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
255f0 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
25600 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
25610 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
25620 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
25630 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
25640 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20   p->selFlags;.. 
25650 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
25660 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
25670 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
25680 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
25690 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
256a0 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  }.  if( NEVER(p-
256b0 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65  >pSrc==0) || (se
256c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
256d0 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
256e0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
256f0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
25700 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
25710 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
25720 3b 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  ;.  if( pWalker-
25730 3e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  >xSelectCallback
25740 32 3d 3d 73 65 6c 65 63 74 50 6f 70 57 69 74 68  2==selectPopWith
25750 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   ){.    sqlite3W
25760 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20  ithPush(pParse, 
25770 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
25780 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d  ->pWith, 0);.  }
25790 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
257a0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
257b0 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
257c0 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
257d0 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
257e0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
257f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
25800 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
25810 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
25820 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
25830 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c  abList);..  /* L
25840 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
25850 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
25860 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
25870 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
25880 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
25890 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
258a0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
258b0 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
258c0 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
258d0 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
258e0 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
258f0 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
25900 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
25910 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
25920 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
25930 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
25940 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
25950 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
25960 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
25970 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65  ( pFrom->fg.isRe
25980 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46  cursive==0 || pF
25990 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a  rom->pTab!=0 );.
259a0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66      if( pFrom->f
259b0 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 20  g.isRecursive ) 
259c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
259d0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
259e0 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  b==0 );.#ifndef 
259f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
25a00 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61      if( withExpa
25a10 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  nd(pWalker, pFro
25a20 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
25a30 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70  Abort;.    if( p
25a40 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20  From->pTab ) {} 
25a50 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
25a60 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
25a70 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
25a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
25a90 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
25aa0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
25ab0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
25ac0 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
25ad0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25ae0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
25af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
25b00 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
25b10 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
25b20 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ab==0 );.      i
25b30 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  f( sqlite3WalkSe
25b40 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
25b50 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  el) ) return WRC
25b60 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46  _Abort;.      pF
25b70 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
25b80 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
25b90 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
25ba0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
25bb0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
25bc0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25bd0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
25be0 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61  f = 1;.      pTa
25bf0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
25c00 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
25c10 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76  qlite_sq_%p", (v
25c20 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20  oid*)pTab);.    
25c30 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
25c40 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20  Prior ){ pSel = 
25c50 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a  pSel->pPrior; }.
25c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
25c70 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
25c80 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
25c90 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f  EList,&pTab->nCo
25ca0 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  l,&pTab->aCol);.
25cb0 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
25cc0 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
25cd0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
25ce0 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
25cf0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
25d00 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20  (1048576) );.   
25d10 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
25d20 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
25d30 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  l;.#endif.    }e
25d40 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
25d50 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
25d60 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
25d70 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
25d80 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
25d90 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
25da0 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
25db0 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
25dc0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
25dd0 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
25de0 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66  pFrom);.      if
25df0 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
25e00 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25e10 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
25e20 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef==0xffff ){.  
25e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25e40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
25e50 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
25e60 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
25e70 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
25e80 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
25e90 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
25ea0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
25eb0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
25ec0 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
25ed0 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
25ee0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56  ;.      if( !IsV
25ef0 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
25f00 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
25f10 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
25f20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
25f30 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25f40 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
25f50 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
25f60 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
25f70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
25f80 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
25f90 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
25fa0 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53  Tab) || pTab->pS
25fb0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
25fc0 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i16 nCol;.     
25fd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
25fe0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
25ff0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
26000 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26010 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
26020 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
26030 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
26040 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
26050 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
26060 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
26070 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
26080 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
26090 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65  tName(pFrom->pSe
260a0 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lect, pTab->zNam
260b0 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  e);.        nCol
260c0 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
260d0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
260e0 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  l = -1;.        
260f0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
26100 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
26110 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
26120 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
26130 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23   nCol;.      }.#
26140 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
26150 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
26160 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
26170 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
26180 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
26190 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
261a0 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
261b0 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
261c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
261d0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
261e0 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
261f0 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
26200 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
26210 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
26220 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
26230 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
26240 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
26250 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
26260 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
26270 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
26280 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
26290 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
262a0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
262b0 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
262c0 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
262d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
262e0 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
262f0 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
26300 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
26310 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
26320 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
26330 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
26340 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
26350 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
26360 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
26370 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
26380 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
26390 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
263a0 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54  mn.  ** list.  T
263b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
263c0 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
263d0 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45  cate the TK_ASTE
263e0 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73  RISK.  ** expres
263f0 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
26400 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
26410 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
26420 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c  umns in.  ** all
26430 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
26440 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
26450 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
26460 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
26470 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
26480 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
26490 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
264a0 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
264b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
264c0 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45  ++){.    pE = pE
264d0 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
264e0 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
264f0 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
26500 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
26510 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
26520 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
26530 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
26540 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
26550 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d   || (pE->pLeft!=
26560 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  0 && pE->pLeft->
26570 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20  op==TK_ID) );.  
26580 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
26590 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
265a0 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52  ht->op==TK_ASTER
265b0 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ISK ) break;.  }
265c0 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
265d0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
265e0 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
265f0 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
26600 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
26610 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
26620 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
26630 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
26640 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
26650 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
26660 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
26670 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
26680 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
26690 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
266a0 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
266b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
266c0 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
266d0 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
266e0 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
266f0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
26700 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
26710 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
26720 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
26730 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
26740 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
26750 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
26760 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
26770 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
26780 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
26790 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
267a0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20   k++){.      pE 
267b0 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
267c0 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d      pRight = pE-
267d0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  >pRight;.      a
267e0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
267f0 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21  K_DOT || pRight!
26800 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
26810 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  pE->op!=TK_ASTER
26820 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28 70  ISK.       && (p
26830 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
26840 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f   pRight->op!=TK_
26850 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20 20  ASTERISK).      
26860 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
26870 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
26880 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
26890 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
268a0 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
268b0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
268c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
268d0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
268e0 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
268f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
26900 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
26910 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
26920 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
26930 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
26940 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
26950 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
26960 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
26970 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
26980 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
26990 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
269a0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
269b0 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
269c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
269d0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
269e0 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
269f0 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
26a00 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
26a10 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
26a20 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
26a30 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
26a40 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
26a50 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
26a60 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
26a70 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
26a80 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
26a90 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
26aa0 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
26ab0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
26ac0 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
26ad0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
26ae0 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
26af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
26b00 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26b10 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
26b20 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
26b30 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
26b40 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
26b50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26b60 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
26b70 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
26b80 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
26b90 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
26ba0 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
26bb0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
26bc0 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
26bd0 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
26be0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
26bf0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
26c00 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
26c10 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
26c20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
26c30 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a  SchemaName = 0;.
26c40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
26c50 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
26c60 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
26c70 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
26c80 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
26c90 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
26ca0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
26cb0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
26cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26cd0 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
26ce0 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
26cf0 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
26d00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
26d10 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20      pSub = 0;.  
26d20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
26d30 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
26d40 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
26d50 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
26d70 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
26d80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26d90 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
26da0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
26db0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
26dd0 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30  emaName = iDb>=0
26de0 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
26df0 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  zName : "*";.   
26e00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26e10 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
26e20 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
26e30 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
26e40 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
26e50 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
26e60 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
26e70 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
26e80 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
26e90 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
26ea0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
26eb0 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
26ec0 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
26ed0 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
26ee0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
26ef0 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
26f00 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
26f10 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
26f20 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
26f30 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
26f40 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
26f50 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
26f60 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
26f70 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
26f80 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
26f90 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
26fa0 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
26fb0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
26fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26fd0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26fe0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
26ff0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
27000 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
27010 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69  as 'hidden', omi
27020 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78  t it from the ex
27030 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
27040 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
27050 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65   list unless the
27060 20 53 45 4c 45 43 54 20 68 61 73 20 74 68 65 20   SELECT has the 
27070 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
27080 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
27090 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20  bit set..       
270a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
270b0 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46      if( (p->selF
270c0 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64  lags & SF_Includ
270d0 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20  eHidden)==0.    
270e0 20 20 20 20 20 20 20 20 20 26 26 20 49 73 48 69           && IsHi
270f0 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
27100 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20  ->aCol[j]) .    
27110 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
27120 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
27130 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
27140 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62  .            tab
27150 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20  leSeen = 1;..   
27160 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
27170 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b   && zTName==0 ){
27180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
27190 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f  f( (pFrom->fg.jo
271a0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
271b0 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RAL)!=0.        
271c0 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65          && table
271d0 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
271e0 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d  TabList, i, zNam
271f0 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20  e, 0, 0).       
27200 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
27210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
27220 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
27230 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
27240 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
27250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27260 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  ** table to the 
27270 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69  right of the joi
27280 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
27290 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
272b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
272c0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
272d0 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e  dex(pFrom->pUsin
272e0 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27300 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
27310 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
27320 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
27330 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
27340 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
27350 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
27360 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
27370 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
27380 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
273a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
273b0 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
273c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
273d0 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
273e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
273f0 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
27400 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
27410 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
27420 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
27430 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
27440 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
27450 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
27460 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
27470 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
27480 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
27490 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
274a0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
274b0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
274c0 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
274d0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
274e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
274f0 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65   if( zSchemaName
27500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27510 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
27520 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
27530 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b  D, zSchemaName);
27540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27550 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
27560 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
27570 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78  _DOT, pLeft, pEx
27580 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
27590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
275a0 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
275b0 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
275c0 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
275d0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
275e0 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
275f0 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  abName, zName);.
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27610 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61  zToFree = zColna
27620 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
27630 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
27640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27650 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
27660 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
27670 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
27680 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
27690 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
276a0 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29  se, pNew, pExpr)
276b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
276c0 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
276d0 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  sColname, zColna
276e0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
276f0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
27700 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
27710 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
27720 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
27730 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d   if( pNew && (p-
27740 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
27750 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b  estedFrom)!=0 ){
27760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
27770 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
27780 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d  tem *pX = &pNew-
27790 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
277a0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
277b0 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20   if( pSub ){.   
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
277d0 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
277e0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75  DbStrDup(db, pSu
277f0 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
27800 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
27810 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27820 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
27830 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27850 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
27860 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
27870 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22  f(db, "%s.%s.%s"
27880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63               zSc
278b0 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  hemaName, zTabNa
278c0 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
278d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
278e0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
278f0 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
27900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27910 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e         pX->bSpan
27920 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20  IsTab = 1;.     
27930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27940 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
27950 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b  ee(db, zToFree);
27960 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
27980 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
27990 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
279a0 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
279b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
279c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
279d0 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
279e0 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
279f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27a00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27a10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
27a20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
27a30 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
27a40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
27a50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27a60 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
27a70 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
27a80 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
27a90 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66   = pNew;.  }.#if
27aa0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
27ab0 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  MN.  if( p->pELi
27ac0 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  st && p->pEList-
27ad0 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
27ae0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
27af0 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
27b00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27b10 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
27b20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
27b30 74 20 73 65 74 22 29 3b 0a 20 20 20 20 72 65 74  t set");.    ret
27b40 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
27b50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
27b60 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
27b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
27b80 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
27b90 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
27ba0 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
27bb0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
27bc0 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
27bd0 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
27be0 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
27bf0 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
27c00 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
27c10 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
27c20 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
27c30 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
27c40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
27c50 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
27c60 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
27c70 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
27c80 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
27c90 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
27ca0 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
27cb0 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
27cc0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
27cd0 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ree..*/.int sqli
27ce0 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  te3ExprWalkNoop(
27cf0 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
27d00 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
27d10 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
27d20 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
27d30 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
27d40 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
27d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
27d60 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22  outine "expands"
27d70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
27d80 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ent and all of i
27d90 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  ts subqueries..*
27da0 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * For additional
27db0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
27dc0 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f  what it means to
27dd0 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45   "expand" a SELE
27de0 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c  CT.** statement,
27df0 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   see the comment
27e00 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78   on the selectEx
27e10 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c  pand worker call
27e20 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  back above..**.*
27e30 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45  * Expanding a SE
27e40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
27e50 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  s the first step
27e60 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61   in processing a
27e70 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
27e80 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43  ment.  The SELEC
27e90 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74  T statement must
27ea0 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66   be expanded bef
27eb0 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  ore.** name reso
27ec0 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  lution is perfor
27ed0 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  med..**.** If an
27ee0 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
27ef0 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  g, an error mess
27f00 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
27f10 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54  nto pParse..** T
27f20 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
27f30 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74  ion can detect t
27f40 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f  he problem by lo
27f50 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d  oking at pParse-
27f60 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20  >nErr.** and/or 
27f70 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
27f80 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61  ocFailed..*/.sta
27f90 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
27fa0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72  SelectExpand(Par
27fb0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
27fc0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
27fd0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
27fe0 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
27ff0 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
28000 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
28010 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
28020 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
28030 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  se;.  if( pParse
28040 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b  ->hasCompound ){
28050 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
28060 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74  llback = convert
28070 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
28080 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71  Subquery;.    sq
28090 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
280a0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  &w, pSelect);.  
280b0 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  }.  w.xSelectCal
280c0 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
280d0 70 61 6e 64 65 72 3b 0a 20 20 69 66 28 20 28 70  pander;.  if( (p
280e0 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
280f0 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
28100 29 3d 3d 30 20 29 7b 0a 20 20 20 20 77 2e 78 53  )==0 ){.    w.xS
28110 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
28120 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
28130 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 57 61 6c    }.  sqlite3Wal
28140 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
28150 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
28160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
28170 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
28180 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
28190 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
281a0 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
281b0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
281c0 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
281d0 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
281e0 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
281f0 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
28200 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
28210 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
28220 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
28230 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
28240 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
28250 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
28260 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
28270 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
28280 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
28290 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
282a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
282b0 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
282c0 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
282d0 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
282e0 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
282f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
28300 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
28310 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
28320 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
28330 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
28340 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
28350 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
28360 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
28370 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
28380 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28390 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
283a0 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
283b0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
283c0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
283d0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
283e0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
283f0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
28400 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
28410 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
28420 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
28430 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73  Resolved );.  as
28440 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
28450 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
28460 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  nfo)==0 );.  p->
28470 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
28480 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50  asTypeInfo;.  pP
28490 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
284a0 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69  pParse;.  pTabLi
284b0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
284c0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
284d0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
284e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
284f0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
28500 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
28510 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
28520 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
28530 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
28540 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
28550 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
28560 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
28570 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
28580 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
28590 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65  LECT */.      Se
285a0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
285b0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
285c0 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
285d0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
285e0 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
285f0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
28600 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28610 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
28620 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
28630 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
28640 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
28650 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
28660 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
28670 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
28680 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
28690 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
286a0 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
286b0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
286c0 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
286d0 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
286e0 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
286f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
28700 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
28710 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
28720 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
28730 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
28740 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
28750 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
28760 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
28770 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28780 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
28790 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
287a0 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
287b0 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63  (w));.  w.xSelec
287c0 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
287d0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
287e0 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
287f0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
28800 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
28810 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
28820 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
28830 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
28840 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
28850 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
28860 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
28870 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28880 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
28890 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
288a0 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
288b0 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
288c0 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
288d0 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
288e0 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
288f0 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
28900 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
28910 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
28920 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
28930 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
28940 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
28950 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
28960 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
28970 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
28980 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
28990 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
289a0 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
289b0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
289c0 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
289d0 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
289e0 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
289f0 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
28a00 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
28a10 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
28a20 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
28a30 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
28a40 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
28a50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
28a60 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
28a70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
28a80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
28a90 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
28aa0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
28ab0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
28ac0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
28ad0 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
28ae0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
28af0 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
28b00 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
28b10 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73  tainer */.){.  s
28b20 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
28b30 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
28b40 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
28b50 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
28b60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28b70 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
28b80 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
28b90 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
28ba0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
28bb0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
28bc0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
28bd0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
28be0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28bf0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
28c00 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
28c10 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
28c20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
28c30 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
28c40 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
28c50 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
28c60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
28c70 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
28c80 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
28c90 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
28ca0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
28cb0 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
28cc0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
28cd0 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
28ce0 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
28cf0 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
28d00 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
28d10 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
28d20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
28d30 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
28d40 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
28d50 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
28d60 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
28d70 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
28d80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
28d90 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
28da0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
28db0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
28dc0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
28dd0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
28de0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
28df0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
28e00 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
28e10 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
28e20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
28e30 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
28e40 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
28e50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
28e60 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
28e70 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
28e80 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
28e90 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
28ea0 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
28eb0 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
28ec0 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
28ed0 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
28ee0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
28ef0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
28f00 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
28f10 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
28f20 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
28f30 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
28f40 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
28f50 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
28f60 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
28f70 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
28f80 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
28f90 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
28fa0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
28fb0 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
28fc0 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
28fd0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
28fe0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
28ff0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
29000 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
29010 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
29020 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
29030 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
29040 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
29050 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
29060 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
29070 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
29080 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
29090 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
290a0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
290b0 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
290c0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
290d0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
290e0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
290f0 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
29100 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
29110 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
29120 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
29130 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
29140 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
29150 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
29160 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
29170 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
29180 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
29190 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
291a0 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
291b0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
291c0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
291d0 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
291e0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
291f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
29200 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
29210 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
29220 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
29230 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  E->x.pList, 0, 0
29240 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
29250 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
29260 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
29270 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
29280 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292a0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
292b0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
292c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
292d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
292e0 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
292f0 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
29300 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
29310 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
29320 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
29330 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
29340 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
29350 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
29360 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
29370 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
29380 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
29390 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
293a0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
293b0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
293c0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
293d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
293e0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
293f0 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
29400 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
29410 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
29420 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
29430 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
29440 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
29450 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
29460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29470 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
29480 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
29490 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
294a0 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
294b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294c0 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
294d0 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
294e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
294f0 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
29500 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
29510 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
29520 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
29530 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
29540 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
29550 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
29560 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
29570 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
29580 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
29590 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
295a0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
295b0 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
295c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
295d0 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
295e0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
295f0 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
29600 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
29610 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
29620 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
29630 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
29640 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
29650 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
29660 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
29670 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
29680 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
29690 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
296a0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
296b0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
296c0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
296d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
296e0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
296f0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
29700 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
29710 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
29720 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
29730 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
29740 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
29750 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
29760 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
29770 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
29780 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
29790 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45  egAgg, 0, SQLITE
297a0 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
297b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
297c0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
297d0 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
297e0 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
297f0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
29800 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
29810 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
29820 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
29830 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20  ase( nArg==0 ); 
29840 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74   /* Error condit
29850 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ion */.      tes
29860 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b  tcase( nArg>1 );
29870 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72     /* Also an er
29880 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64  ror */.      cod
29890 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
298a0 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
298b0 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
298c0 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
298d0 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
298e0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
298f0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
29900 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
29910 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
29920 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
29930 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
29940 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
29950 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
29960 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
29970 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
29980 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
29990 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
299a0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
299b0 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
299c0 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
299d0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
299e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
299f0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
29a00 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
29a10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
29a20 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
29a30 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
29a40 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
29a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
29a60 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
29a70 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
29a80 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20  ator ) regHit = 
29a90 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
29aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29ab0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
29ac0 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30  llSeq, regHit, 0
29ad0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
29ae0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
29af0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29b00 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
29b10 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20  OP_AggStep0, 0, 
29b20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
29b30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29b40 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
29b50 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
29b60 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
29b70 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
29b80 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
29b90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
29ba0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
29bb0 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
29bc0 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
29bd0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
29be0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
29bf0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
29c00 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
29c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
29c20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
29c30 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
29c40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29c50 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
29c60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
29c70 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67  efore populating
29c80 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
29c90 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61   registers, clea
29ca0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  r the column cac
29cb0 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  he..  ** Otherwi
29cc0 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68  se, if any of th
29cd0 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d  e required colum
29ce0 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72  n values are alr
29cf0 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20  eady present .  
29d00 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c  ** in registers,
29d10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
29d20 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43  () may use OP_SC
29d30 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  opy to copy the 
29d40 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43  value.  ** to pC
29d50 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74  ->iMem. But by t
29d60 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75  he time the valu
29d70 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f  e is used, the o
29d80 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72  riginal register
29d90 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62  .  ** may have b
29da0 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69  een used, invali
29db0 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72  dating the under
29dc0 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c  lying buffer hol
29dd0 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65  ding the.  ** te
29de0 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65  xt or blob value
29df0 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38  . See ticket [88
29e00 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a  3034dcb5]..  **.
29e10 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c    ** Another sol
29e20 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74  ution would be t
29e30 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  o change the OP_
29e40 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f  SCopy used to co
29e50 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76  py cached.  ** v
29e60 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43  alues to an OP_C
29e70 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  opy..  */.  if( 
29e80 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64  regHit ){.    ad
29e90 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69  drHitTest = sqli
29ea0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
29eb0 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b   OP_If, regHit);
29ec0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
29ed0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
29ee0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
29ef0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
29f00 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
29f10 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
29f20 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
29f30 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
29f40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
29f50 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
29f60 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
29f70 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
29f80 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
29f90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
29fa0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
29fb0 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
29fc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
29fd0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
29fe0 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
29ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
2a000 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
2a010 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
2a020 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
2a030 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
2a040 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
2a050 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
2a060 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
2a070 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a080 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
2a090 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
2a0a0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
2a0b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a0d0 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
2a0e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
2a0f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a100 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
2a110 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
2a120 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a140 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
2a150 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
2a160 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
2a170 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
2a180 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69  lain==2 ){.    i
2a190 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64  nt bCover = (pId
2a1a0 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69  x!=0 && (HasRowi
2a1b0 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72  d(pTab) || !IsPr
2a1c0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
2a1d0 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20  dx)));.    char 
2a1e0 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d  *zEqp = sqlite3M
2a1f0 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
2a200 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  b, "SCAN TABLE %
2a210 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
2a220 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
2a230 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20       bCover ? " 
2a240 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
2a250 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
2a260 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49       bCover ? pI
2a270 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20  dx->zName : "". 
2a280 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
2a290 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
2a2a0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64       pParse->pVd
2a2b0 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  be, OP_Explain, 
2a2c0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2a2d0 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50  d, 0, 0, zEqp, P
2a2e0 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b  4_DYNAMIC.    );
2a2f0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
2a300 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d  efine explainSim
2a310 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a  pleCount(a,b,c).
2a320 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
2a330 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2a340 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2a350 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
2a360 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
2a370 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
2a380 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61  s are returned a
2a390 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
2a3a0 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
2a3b0 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  ture..** See com
2a3c0 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49  ments in sqliteI
2a3d0 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72  nt.h for further
2a3e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
2a3f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a400 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2a410 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
2a420 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
2a430 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
2a440 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
2a450 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
2a460 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
2a470 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
2a480 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
2a490 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
2a4a0 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
2a4b0 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2a4c0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
2a4d0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
2a4e0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
2a4f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2a500 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
2a510 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2a520 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2a530 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2a540 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2a550 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2a560 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2a570 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
2a580 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
2a590 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
2a5a0 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
2a5b0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
2a5c0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2a5d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2a5e0 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
2a5f0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2a600 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
2a610 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2a620 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
2a630 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2a640 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2a650 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
2a660 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
2a670 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
2a680 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2a690 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
2a6a0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
2a6b0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2a6c0 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c  EList = 0;  /* L
2a6d0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
2a6e0 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
2a6f0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2a700 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
2a710 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
2a720 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
2a730 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
2a740 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2a750 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2a760 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
2a770 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
2a780 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
2a790 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
2a7a0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2a7b0 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
2a7c0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
2a7d0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2a7e0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
2a7f0 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
2a800 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
2a810 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
2a820 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  unction */.  Dis
2a830 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
2a840 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
2a850 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
2a860 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2a870 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f  */.  SortCtx sSo
2a880 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt;         /* I
2a890 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
2a8a0 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  de the ORDER BY 
2a8b0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49  clause */.  AggI
2a8c0 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
2a8d0 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
2a8e0 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
2a8f0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
2a900 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
2a910 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2a920 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
2a930 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
2a940 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2a950 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2a960 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a970 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  n */..#ifndef SQ
2a980 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2a990 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65  N.  int iRestore
2a9a0 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
2a9b0 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20  e->iSelectId;.  
2a9c0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2a9d0 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  d = pParse->iNex
2a9e0 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e  tSelectId++;.#en
2a9f0 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72  dif..  db = pPar
2aa00 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d  se->db;.  if( p=
2aa10 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
2aa20 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
2aa30 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
2aa40 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2aa50 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
2aa60 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
2aa70 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
2aa80 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
2aa90 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
2aaa0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
2aab0 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c  gInfo));.#if SEL
2aac0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2aad0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65  .  pParse->nSele
2aae0 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45  ctIndent++;.  SE
2aaf0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
2ab00 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72  se,p, ("begin pr
2ab10 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a  ocessing:\n"));.
2ab20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2ab30 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2ab40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
2ab50 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2ab60 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2ab70 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
2ab80 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2ab90 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2aba0 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
2abb0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2abc0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2abd0 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f  >eDest!=SRT_Fifo
2abe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2abf0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2ac00 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2ac10 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20  T_DistQueue );. 
2ac20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2ac30 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2ac40 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ->eDest!=SRT_Que
2ac50 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f  ue );.  if( Igno
2ac60 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
2ac70 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
2ac80 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
2ac90 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
2aca0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2acb0 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
2acc0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2acd0 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
2ace0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2acf0 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20  RT_Discard ||.  
2ad00 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2ad10 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65  eDest==SRT_Queue
2ad20 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73    || pDest->eDes
2ad30 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
2ad40 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
2ad50 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2ad60 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65  DistQueue || pDe
2ad70 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46  st->eDest==SRT_F
2ad80 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ifo);.    /* If 
2ad90 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
2ada0 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
2adb0 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
2adc0 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
2add0 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
2ade0 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
2adf0 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
2ae00 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2ae10 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
2ae20 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
2ae30 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
2ae40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2ae50 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
2ae60 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
2ae70 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
2ae80 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  );.  memset(&sSo
2ae90 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
2aea0 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
2aeb0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2aec0 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
2aed0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  t = p->pSrc;.  i
2aee0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2aef0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2af00 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2af10 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
2af20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
2af30 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67  ist!=0 );.  isAg
2af40 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
2af50 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2af60 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  !=0;.#if SELECTT
2af70 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2af80 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2af90 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2afa0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2afb0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2afc0 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65   ("after name re
2afd0 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  solution:\n"));.
2afe0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2aff0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2b000 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2b010 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
2b020 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
2b030 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
2b040 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
2b050 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
2b060 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
2b070 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b080 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
2b090 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
2b0a0 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
2b0b0 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 2d  Parse, pDest, p-
2b0c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
2b0d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
2b0e0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
2b0f0 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  if..  /* Try to 
2b100 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
2b110 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2b120 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68  lause up into th
2b130 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a  e main query.  *
2b140 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2b150 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2b160 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2b170 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2b180 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
2b190 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
2b1a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2b1b0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2b1c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2b1d0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2b1e0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
2b1f0 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
2b200 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
2b210 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20 54   isAggSub;.    T
2b220 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
2b230 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
2b240 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2b250 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
2b260 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
2b270 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
2b280 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
2b290 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
2b2a0 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
2b2b0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
2b2c0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
2b2d0 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
2b2e0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
2b2f0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
2b300 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2b310 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
2b320 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
2b330 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b350 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2b360 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
2b370 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
2b380 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
2b390 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2b3a0 7d 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  }..    isAggSub 
2b3b0 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
2b3c0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2b3d0 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
2b3e0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
2b3f0 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
2b400 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
2b410 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
2b420 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
2b430 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
2b440 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2b450 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
2b460 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
2b470 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
2b480 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
2b490 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
2b4a0 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
2b4b0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
2b4c0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
2b4d0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2b4e0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2b4f0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2b500 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
2b510 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2b520 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2b530 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2b540 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2b550 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  f..  /* Get a po
2b560 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75  inter the VDBE u
2b570 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2b580 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  n, allocating a 
2b590 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a  new VDBE if one.
2b5a0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c    ** does not al
2b5b0 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20  ready exist */. 
2b5c0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
2b5d0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
2b5e0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
2b5f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e  elect_end;..#ifn
2b600 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b610 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
2b620 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
2b630 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
2b640 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
2b650 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
2b660 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
2b670 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
2b680 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
2b690 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
2b6a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
2b6b0 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c  pDest);.    expl
2b6c0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
2b6d0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2b6e0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2b6f0 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  d);.#if SELECTTR
2b700 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2b710 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
2b720 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
2b730 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
2b740 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
2b750 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2b760 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
2b770 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  f.    return rc;
2b780 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2b790 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2b7a0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
2b7b0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2b7c0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
2b7d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2b7e0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
2b7f0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
2b800 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
2b810 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2b820 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2b830 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2b840 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2b850 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2b860 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
2b870 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
2b880 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2b890 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
2b8a0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2b8b0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
2b8c0 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
2b8d0 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
2b8e0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
2b8f0 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
2b900 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
2b910 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
2b920 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2b930 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
2b940 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
2b950 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
2b960 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
2b970 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
2b980 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
2b990 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
2b9a0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
2b9b0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
2b9c0 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
2b9d0 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
2b9e0 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
2b9f0 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
2ba00 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
2ba10 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
2ba20 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
2ba30 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
2ba40 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2ba50 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
2ba60 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2ba70 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2ba80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2ba90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2baa0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
2bab0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
2bac0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2bad0 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
2bae0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2baf0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
2bb00 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
2bb10 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
2bb20 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
2bb30 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
2bb40 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
2bb50 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
2bb60 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
2bb70 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
2bb80 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
2bb90 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
2bba0 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
2bbb0 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
2bbc0 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
2bbd0 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
2bbe0 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
2bbf0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
2bc00 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
2bc10 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
2bc20 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
2bc30 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
2bc40 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
2bc50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
2bc60 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
2bc70 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2bc80 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
2bc90 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
2bca0 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
2bcb0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
2bcc0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2bcd0 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
2bce0 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
2bcf0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
2bd00 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
2bd10 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
2bd20 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
2bd30 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67    if( (pItem->fg
2bd40 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
2bd50 55 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26  UTER)==0.     &&
2bd60 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
2bd70 72 6d 73 28 64 62 2c 20 70 53 75 62 2c 20 70 2d  rms(db, pSub, p-
2bd80 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
2bd90 69 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a  iCursor).    ){.
2bda0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2bdb0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66  ENABLED.      if
2bdc0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2bdd0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2bde0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52          SELECTTR
2bdf0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2be00 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45  ,p,("After WHERE
2be10 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77  -clause push-dow
2be20 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  n:\n"));.       
2be30 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2be40 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2be50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2be60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
2be70 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69  nerate code to i
2be80 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62  mplement the sub
2be90 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20  query.    **.   
2bea0 20 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   ** The subquery
2beb0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
2bec0 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
2bed0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
2bee0 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a  are true:.    **
2bef0 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
2bf00 75 65 72 79 20 69 73 20 67 75 61 72 61 6e 74 65  uery is guarante
2bf10 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74  ed to be the out
2bf20 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74  er loop (so that
2bf30 20 69 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   it.    **      
2bf40 20 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20    does not need 
2bf50 74 6f 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6d  to be computed m
2bf60 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20  ore than once). 
2bf70 20 20 20 2a 2a 20 20 20 28 32 29 20 20 54 68 65     **   (2)  The
2bf80 20 41 4c 4c 20 6b 65 79 77 6f 72 64 20 61 66 74   ALL keyword aft
2bf90 65 72 20 53 45 4c 45 43 54 20 69 73 20 6f 6d 69  er SELECT is omi
2bfa0 74 74 65 64 2e 20 20 28 41 70 70 6c 69 63 61 74  tted.  (Applicat
2bfb0 69 6f 6e 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ions are.    ** 
2bfc0 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 74         allowed t
2bfd0 6f 20 73 61 79 20 22 53 45 4c 45 43 54 20 41 4c  o say "SELECT AL
2bfe0 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75  L" instead of ju
2bff0 73 74 20 22 53 45 4c 45 43 54 22 20 74 6f 20 64  st "SELECT" to d
2c000 69 73 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20  isable.    **   
2c010 20 20 20 20 20 74 68 65 20 75 73 65 20 6f 66 20       the use of 
2c020 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 29 0a 20 20  co-routines.).  
2c030 20 20 2a 2a 20 20 20 28 33 29 20 20 43 6f 2d 72    **   (3)  Co-r
2c040 6f 75 74 69 6e 65 73 20 61 72 65 20 6e 6f 74 20  outines are not 
2c050 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 73  disabled using s
2c060 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2c070 72 6f 6c 28 29 0a 20 20 20 20 2a 2a 20 20 20 20  rol().    **    
2c080 20 20 20 20 77 69 74 68 20 53 51 4c 49 54 45 5f      with SQLITE_
2c090 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
2c0a0 41 54 49 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a 20  ATIONS..    **. 
2c0b0 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20     ** TODO: Are 
2c0c0 74 68 65 72 65 20 6f 74 68 65 72 20 72 65 61 73  there other reas
2c0d0 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29 20 74  ons beside (1) t
2c0e0 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69  o use a co-routi
2c0f0 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  ne.    ** implem
2c100 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f  entation?.    */
2c110 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20  .    if( i==0.  
2c120 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d     && (pTabList-
2c130 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20  >nSrc==1.       
2c140 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73       || (pTabLis
2c150 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74  t->a[1].fg.joint
2c160 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ype&(JT_LEFT|JT_
2c170 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20  CROSS))!=0)  /* 
2c180 28 31 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 28  (1) */.     && (
2c190 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2c1a0 5f 41 6c 6c 29 3d 3d 30 20 20 20 20 20 20 20 20  _All)==0        
2c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
2c1d0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 4f 70 74  ) */.     && Opt
2c1e0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
2c1f0 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71  (db, SQLITE_Subq
2c200 43 6f 72 6f 75 74 69 6e 65 29 20 20 20 20 20 20  Coroutine)      
2c210 20 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20           /* (3) 
2c220 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
2c230 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63  /* Implement a c
2c240 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  o-routine that w
2c250 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e  ill return a sin
2c260 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
2c270 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
2c280 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63  et on each invoc
2c290 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ation..      */.
2c2a0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2c2b0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
2c2c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b  urrentAddr(v)+1;
2c2d0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2c2e0 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
2c2f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2c300 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c310 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
2c320 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
2c330 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72  gReturn, 0, addr
2c340 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Top);.      Vdbe
2c350 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
2c360 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2c370 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49  Name));.      pI
2c380 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2c390 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20   = addrTop;.    
2c3a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2c3b0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2c3c0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  RT_Coroutine, pI
2c3d0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2c3e0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
2c3f0 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2c400 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
2c410 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2c420 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ctId);.      sql
2c430 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
2c440 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
2c450 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
2c460 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
2c470 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
2c480 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  w;.      pItem->
2c490 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
2c4a0 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  = 1;.      pItem
2c4b0 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65  ->regResult = de
2c4c0 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20  st.iSdst;.      
2c4d0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
2c4e0 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d  routine(v, pItem
2c4f0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2c500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2c510 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
2c520 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  op-1);.      sql
2c530 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
2c540 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
2c550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c560 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
2c570 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
2c580 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
2c590 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
2c5a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
2c5b0 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
2c5c0 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
2c5d0 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
2c5e0 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
2c5f0 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
2c600 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
2c610 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
2c620 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
2c630 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
2c640 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
2c650 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
2c660 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
2c670 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
2c680 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
2c690 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
2c6a0 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
2c6b0 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
2c6c0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
2c6d0 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
2c6e0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2c6f0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2c700 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2c710 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
2c720 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2c730 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
2c740 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2c750 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
2c760 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
2c770 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66  Addr+1;.      if
2c780 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f  ( pItem->fg.isCo
2c790 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20  rrelated==0 ){. 
2c7a0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
2c7b0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
2c7c0 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20   correlated and 
2c7d0 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
2c7e0 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20  side of.        
2c7f0 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  ** a trigger, th
2c800 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  en we only need 
2c810 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76  to compute the v
2c820 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71  alue of the subq
2c830 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
2c840 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  once. */.       
2c850 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
2c860 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
2c870 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
2c880 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
2c890 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  beComment((v, "m
2c8a0 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
2c8b0 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
2c8c0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2c8d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56  }else{.        V
2c8e0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
2c8f0 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
2c900 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
2c910 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2c920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2c930 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
2c940 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
2c950 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
2c960 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65  Cursor);.      e
2c970 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2c980 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
2c990 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
2c9a0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
2c9b0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2c9c0 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
2c9d0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
2c9e0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
2c9f0 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
2ca00 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
2ca10 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
2ca20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2ca30 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
2ca40 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
2ca50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2ca60 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2ca70 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2ca80 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
2ca90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
2caa0 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
2cab0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2cac0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2cad0 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
2cae0 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
2caf0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
2cb00 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
2cb10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2cb20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2cb30 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2cb40 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  end;.    pParse-
2cb50 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69  >nHeight -= sqli
2cb60 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2cb70 67 68 74 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  ght(p);.  }.#end
2cb80 69 66 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73  if..  /* Various
2cb90 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
2cba0 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69   SELECT copied i
2cbb0 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  nto local variab
2cbc0 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e  les for.  ** con
2cbd0 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45  venience */.  pE
2cbe0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
2cbf0 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
2cc00 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
2cc10 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
2cc20 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
2cc30 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
2cc40 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
2cc50 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2cc60 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
2cc70 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2cc80 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2cc90 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2cca0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
2ccb0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
2ccc0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
2ccd0 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  er all FROM-clau
2cce0 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29  se analysis:\n")
2ccf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2cd00 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2cd10 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2cd20 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71  f..  /* If the q
2cd30 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54  uery is DISTINCT
2cd40 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
2cd50 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20  Y but is not an 
2cd60 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a  aggregate, and .
2cd70 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65    ** if the sele
2cd80 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73  ct-list is the s
2cd90 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52  ame as the ORDER
2cda0 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74   BY list, then t
2cdb0 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63  his query.  ** c
2cdc0 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
2cdd0 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49  as a GROUP BY. I
2cde0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
2cdf0 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
2ce00 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
2ce10 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
2ce20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
2ce30 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66  *.  ** is transf
2ce40 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20  ormed to:.  **. 
2ce50 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
2ce60 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55  yz FROM ... GROU
2ce70 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42  P BY xyz ORDER B
2ce80 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
2ce90 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
2cea0 69 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20  is preferred as 
2ceb0 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28  a single index (
2cec0 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d  or temp-table) m
2ced0 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64  ay be .  ** used
2cee0 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52   for both the OR
2cef0 44 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49  DER BY and DISTI
2cf00 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  NCT processing. 
2cf10 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20  As originally . 
2cf20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20   ** written the 
2cf30 71 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61  query must use a
2cf40 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
2cf50 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
2cf60 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20  the ORDER .  ** 
2cf70 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c  BY and DISTINCT,
2cf80 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72   and an index or
2cf90 20 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74   separate temp-t
2cfa0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68  able for the oth
2cfb0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
2cfc0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
2cfd0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
2cfe0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
2cff0 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71  stinct .   && sq
2d000 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2d010 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65  pare(sSort.pOrde
2d020 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29  rBy, pEList, -1)
2d030 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  ==0.  ){.    p->
2d040 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
2d050 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47  Distinct;.    pG
2d060 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
2d070 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
2d080 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45  prListDup(db, pE
2d090 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a  List, 0);.    /*
2d0a0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65   Notice that eve
2d0b0 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73  n thought SF_Dis
2d0c0 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63  tinct has been c
2d0d0 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73  leared from p->s
2d0e0 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20  elFlags,.    ** 
2d0f0 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73  the sDistinct.is
2d100 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65  Tnct is still se
2d110 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63  t.  Hence, isTnc
2d120 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2d130 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  .    ** original
2d140 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20   setting of the 
2d150 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67  SF_Distinct flag
2d160 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e  , not the curren
2d170 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20  t setting */.   
2d180 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e   assert( sDistin
2d190 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69  ct.isTnct );..#i
2d1a0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2d1b0 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
2d1c0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2d1d0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
2d1e0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2d1f0 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 54  400,pParse,p,("T
2d200 72 61 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e 43  ransform DISTINC
2d210 54 20 69 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a  T into GROUP BY:
2d220 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  \n"));.      sql
2d230 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2d240 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ct(0, p, 0);.   
2d250 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
2d260 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2d270 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2d280 73 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  se, then create 
2d290 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
2d2a0 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68  ex to.  ** do th
2d2b0 65 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20  e sorting.  But 
2d2c0 74 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68  this sorting eph
2d2d0 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67  emeral index mig
2d2e0 68 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62  ht end up.  ** b
2d2f0 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
2d300 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 65  he data can be e
2d310 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
2d320 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20  sorted order..  
2d330 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20 74 68  ** If that is th
2d340 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
2d350 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2d360 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
2d370 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67  ll be.  ** chang
2d380 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70  ed to an OP_Noop
2d390 20 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65 20   once we figure 
2d3a0 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
2d3b0 74 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20  ting index is.  
2d3c0 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  ** not needed.  
2d3d0 54 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  The sSort.addrSo
2d3e0 72 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65  rtIndex variable
2d3f0 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69   is used to faci
2d400 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74  litate.  ** that
2d410 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
2d420 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
2d430 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
2d440 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
2d450 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
2d460 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2d470 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f  pParse, sSort.pO
2d480 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73  rderBy, 0, pELis
2d490 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73  t->nExpr);.    s
2d4a0 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20  Sort.iECursor = 
2d4b0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2d4c0 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
2d4d0 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20  rtIndex =.      
2d4e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d4f0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
2d500 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
2d510 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c   sSort.iECursor,
2d520 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d   sSort.pOrderBy-
2d530 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d  >nExpr+1+pEList-
2d540 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20  >nExpr, 0,.     
2d550 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
2d560 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2d570 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  .      );.  }els
2d580 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64  e{.    sSort.add
2d590 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b  rSortIndex = -1;
2d5a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2d5b0 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
2d5c0 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
2d5d0 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
2d5e0 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
2d5f0 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65  /.  if( pDest->e
2d600 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
2d610 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
2d620 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2d630 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2d640 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
2d650 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
2d660 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d670 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f  he limiter..  */
2d680 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  .  iEnd = sqlite
2d690 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2d6a0 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  );.  p->nSelectR
2d6b0 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
2d6c0 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
2d6d0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
2d6e0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
2d6f0 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20  p, iEnd);.  if( 
2d700 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20  p->iLimit==0 && 
2d710 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2d720 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex>=0 ){.    sq
2d730 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f  lite3VdbeChangeO
2d740 70 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61  pcode(v, sSort.a
2d750 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50  ddrSortIndex, OP
2d760 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20  _SorterOpen);.  
2d770 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67    sSort.sortFlag
2d780 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73  s |= SORTFLAG_Us
2d790 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20  eSorter;.  }..  
2d7a0 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d  /* Open an ephem
2d7b0 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  eral index to us
2d7c0 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
2d7d0 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
2d7e0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
2d7f0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   SF_Distinct ){.
2d800 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
2d810 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  bTnct = pParse->
2d820 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73  nTab++;.    sDis
2d830 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d  tinct.addrTnct =
2d840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d850 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
2d860 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
2d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d880 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74       sDistinct.t
2d890 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  abTnct, 0, 0,.  
2d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8b0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
2d8c0 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  *)keyInfoFromExp
2d8d0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
2d8e0 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20  >pEList,0,0),.  
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
2d910 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
2d920 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2d930 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
2d940 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
2d950 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2d960 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2d970 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
2d980 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2d990 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2d9a0 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
2d9b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
2d9c0 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
2d9d0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
2d9e0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2d9f0 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
2da00 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
2da10 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
2da20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
2da30 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
2da40 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
2da50 20 20 20 20 61 73 73 65 72 74 28 20 57 48 45 52      assert( WHER
2da60 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f  E_USE_LIMIT==SF_
2da70 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20 20  FixedLimit );.  
2da80 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20    wctrlFlags |= 
2da90 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2daa0 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20 20  _FixedLimit;..  
2dab0 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
2dac0 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f  atabase scan. */
2dad0 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
2dae0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2daf0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2db00 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e  , pWhere, sSort.
2db10 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
2db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db30 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
2db40 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  st, wctrlFlags, 
2db50 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  p->nSelectRow);.
2db60 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
2db70 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
2db80 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  end;.    if( sql
2db90 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
2dba0 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20  owCount(pWInfo) 
2dbb0 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  < p->nSelectRow 
2dbc0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  ){.      p->nSel
2dbd0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
2dbe0 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
2dbf0 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  unt(pWInfo);.   
2dc00 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74   }.    if( sDist
2dc10 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73  inct.isTnct && s
2dc20 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
2dc30 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b  tinct(pWInfo) ){
2dc40 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74  .      sDistinct
2dc50 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c  .eTnctType = sql
2dc60 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
2dc70 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  nct(pWInfo);.   
2dc80 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74   }.    if( sSort
2dc90 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2dca0 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20     sSort.nOBSat 
2dcb0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2dcc0 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b  Ordered(pWInfo);
2dcd0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f 72  .      sSort.bOr
2dce0 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d  deredInnerLoop =
2dcf0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64   sqlite3WhereOrd
2dd00 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57  eredInnerLoop(pW
2dd10 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
2dd20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
2dd30 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2dd40 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2dd50 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2dd60 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2dd70 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
2dd80 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
2dd90 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
2dda0 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
2ddb0 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
2ddc0 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
2ddd0 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
2dde0 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
2ddf0 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
2de00 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
2de10 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
2de20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2de30 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2de40 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
2de50 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2de60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2de70 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
2de80 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2de90 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
2dea0 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
2deb0 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
2dec0 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  */.    selectInn
2ded0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2dee0 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73  , pEList, -1, &s
2def0 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
2df00 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
2df10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2df20 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
2df30 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
2df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df50 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2df60 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
2df70 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  o));..    /* End
2df80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2df90 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
2dfa0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2dfb0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
2dfc0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
2dfd0 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
2dfe0 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
2dff0 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
2e000 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2e010 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
2e020 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
2e030 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
2e040 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
2e050 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
2e060 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
2e070 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
2e080 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2e090 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2e0a0 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
2e0b0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
2e0c0 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
2e0d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2e0e0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2e0f0 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
2e100 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
2e110 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
2e120 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
2e130 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
2e140 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
2e150 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
2e160 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
2e170 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
2e180 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
2e190 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1b0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2e1c0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
2e1d0 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
2e1e0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
2e1f0 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
2e200 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
2e210 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
2e220 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
2e230 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
2e240 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
2e250 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
2e260 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
2e270 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
2e280 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
2e290 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
2e2a0 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
2e2b0 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
2e2c0 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
2e2d0 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
2e2e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
2e2f0 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
2e300 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
2e310 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
2e320 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42  /.    int orderB
2e330 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75  yGrp = 0; /* Tru
2e340 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42  e if the GROUP B
2e350 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61  Y and ORDER BY a
2e360 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a  re the same */..
2e370 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
2e380 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
2e390 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
2e3a0 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
2e3b0 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
2e3c0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
2e3d0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2e3e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e400 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2e410 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
2e420 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2e430 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
2e440 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2e450 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
2e460 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
2e470 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
2e480 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
2e490 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
2e4a0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
2e4b0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
2e4c0 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
2e4d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2e4e0 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
2e4f0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
2e500 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
2e510 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
2e520 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
2e530 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
2e540 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2e550 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 66==sqlite3Log
2e560 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20  Est(100) );.    
2e570 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
2e580 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c  Row>66 ) p->nSel
2e590 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20  ectRow = 66;.   
2e5a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
2e5b0 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
2e5c0 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20  LogEst(1) );.   
2e5d0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
2e5e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2e5f0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2e600 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20  both a GROUP BY 
2e610 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20  and an ORDER BY 
2e620 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20  clause and they 
2e630 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74  are.    ** ident
2e640 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61  ical, then it ma
2e650 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  y be possible to
2e660 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44   disable the ORD
2e670 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20  ER BY clause .  
2e680 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75    ** on the grou
2e690 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f  nds that the GRO
2e6a0 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65  UP BY will cause
2e6b0 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d   elements to com
2e6c0 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e  e out .    ** in
2e6d0 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
2e6e0 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20  er. It also may 
2e6f0 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20  not - the GROUP 
2e700 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20  BY might use a. 
2e710 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2e720 6e 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73  ndex that causes
2e730 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75   rows to be grou
2e740 70 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20  ped together as 
2e750 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20  required.    ** 
2e760 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  but not actually
2e770 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20   sorted. Either 
2e780 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20  way, record the 
2e790 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20  fact that the.  
2e7a0 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e    ** ORDER BY an
2e7b0 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  d GROUP BY claus
2e7c0 65 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  es are the same 
2e7d0 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f  by setting the o
2e7e0 72 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a  rderByGrp.    **
2e7f0 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20   variable.  */. 
2e800 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2e810 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47  prListCompare(pG
2e820 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f  roupBy, sSort.pO
2e830 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29  rderBy, -1)==0 )
2e840 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47  {.      orderByG
2e850 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a  rp = 1;.    }. .
2e860 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
2e870 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
2e880 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
2e890 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79   abort the query
2e8a0 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20   */.    addrEnd 
2e8b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2e8c0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
2e8d0 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
2e8e0 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
2e8f0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
2e900 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
2e910 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
2e920 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
2e930 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
2e940 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
2e950 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
2e960 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
2e970 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
2e980 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
2e990 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
2e9a0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2e9b0 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
2e9c0 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
2e9d0 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
2e9e0 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
2e9f0 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d  sAggInfo.mnReg =
2ea00 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2ea10 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
2ea20 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
2ea30 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
2ea40 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  By->nExpr : 0;. 
2ea50 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
2ea60 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
2ea70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2ea80 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
2ea90 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
2eaa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2eab0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
2eac0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2ead0 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  );.    if( pHavi
2eae0 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
2eaf0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2eb00 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
2eb10 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20  Having);.    }. 
2eb20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63     sAggInfo.nAcc
2eb30 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49  umulator = sAggI
2eb40 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  nfo.nColumn;.   
2eb50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2eb60 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
2eb70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2eb80 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2eb90 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b  (sAggInfo.aFunc[
2eba0 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  i].pExpr, EP_xIs
2ebb0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
2ebc0 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
2ebd0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
2ebe0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2ebf0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2ec00 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  NC, sAggInfo.aFu
2ec10 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  nc[i].pExpr->x.p
2ec20 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43  List);.      sNC
2ec30 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  .ncFlags &= ~NC_
2ec40 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d  InAggFunc;.    }
2ec50 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78  .    sAggInfo.mx
2ec60 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2ec70 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  em;.    if( db->
2ec80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2ec90 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2eca0 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
2ecb0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
2ecc0 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
2ecd0 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
2ece0 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
2ecf0 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
2ed00 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
2ed10 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
2ed20 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
2ed30 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
2ed40 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
2ed50 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
2ed60 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
2ed70 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
2ed80 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
2ed90 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
2eda0 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d     /* A-vs-B com
2edb0 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f  parision jump */
2edc0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f  .      int addrO
2edd0 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74  utputRow;  /* St
2ede0 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
2edf0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
2ee00 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
2ee10 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70       int regOutp
2ee20 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75  utRow;   /* Retu
2ee30 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
2ee40 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73  ter for output s
2ee50 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
2ee60 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
2ee70 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68  ort;   /* Set th
2ee80 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
2ee90 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20   return */.     
2eea0 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
2eeb0 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  op;  /* Top of t
2eec0 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
2eed0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2eee0 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68  ortingIdx; /* Th
2eef0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2ef00 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
2ef10 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
2ef20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
2ef30 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
2ef40 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
2ef50 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
2ef60 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  r */.      int r
2ef70 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f  egReset;       /
2ef80 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
2ef90 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
2efa0 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
2efb0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  /..      /* If t
2efc0 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
2efd0 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
2efe0 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
2eff0 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
2f000 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
2f010 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
2f020 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
2f030 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
2f040 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
2f050 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
2f060 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
2f070 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
2f080 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  n instruction.  
2f090 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
2f0a0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
2f0b0 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
2f0c0 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
2f0d0 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
2f0e0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2f0f0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
2f100 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2f110 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
2f120 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e  By, 0, sAggInfo.
2f130 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
2f140 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
2f150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f160 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  p4(v, OP_SorterO
2f170 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pen, .          
2f180 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2f190 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53  Idx, sAggInfo.nS
2f1a0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20  ortingColumn, . 
2f1b0 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61           0, (cha
2f1c0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2f1d0 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20  KEYINFO);..     
2f1e0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
2f1f0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
2f200 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
2f210 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
2f220 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
2f230 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
2f240 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2f250 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
2f260 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2f270 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70  m;.      regOutp
2f280 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  utRow = ++pParse
2f290 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
2f2a0 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
2f2b0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2f2c0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67  el(v);.      reg
2f2d0 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  Reset = ++pParse
2f2e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
2f2f0 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
2f300 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2f310 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  );.      iAMem =
2f320 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
2f330 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
2f340 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
2f350 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2f360 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iBMem = pParse->
2f370 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
2f380 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2f390 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2f3a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f3b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2f3c0 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72  nteger, 0, iAbor
2f3d0 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
2f3e0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
2f3f0 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
2f400 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2f410 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f420 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55  P_Integer, 0, iU
2f430 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
2f440 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2f450 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c  indicate accumul
2f460 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20  ator empty"));. 
2f470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f480 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
2f490 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d  l, 0, iAMem, iAM
2f4a0 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  em+pGroupBy->nEx
2f4b0 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  pr-1);..      /*
2f4c0 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68   Begin a loop th
2f4d0 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
2f4e0 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20  all source rows 
2f4f0 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
2f500 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  r..      ** This
2f510 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74   might involve t
2f520 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70  wo separate loop
2f530 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72  s with an OP_Sor
2f540 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72  t in between, or
2f550 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67  .      ** it mig
2f560 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c  ht be a single l
2f570 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e  oop that uses an
2f580 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63   index to extrac
2f590 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  t information.  
2f5a0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69      ** in the ri
2f5b0 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67  ght order to beg
2f5c0 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a  in with..      *
2f5d0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2f5e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2f5f0 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
2f600 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
2f610 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
2f620 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
2f630 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2f640 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79  pWhere, pGroupBy
2f650 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57  , 0,.          W
2f660 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28  HERE_GROUPBY | (
2f670 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48 45  orderByGrp ? WHE
2f680 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a  RE_SORTBYGROUP :
2f690 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a   0), 0.      );.
2f6a0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2f6b0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
2f6c0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
2f6d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
2f6e0 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d  rdered(pWInfo)==
2f6f0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
2f700 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2f710 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
2f720 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
2f730 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
2f740 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
2f750 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
2f760 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
2f770 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2f780 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
2f790 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
2f7a0 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
2f7b0 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
2f7c0 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
2f7d0 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
2f7e0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
2f7f0 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
2f800 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2f810 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
2f820 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
2f830 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
2f840 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
2f850 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
2f860 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
2f870 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
2f880 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
2f890 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2f8a0 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
2f8b0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
2f8c0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
2f8d0 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
2f8e0 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
2f8f0 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
2f900 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73        int regBas
2f910 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e;.        int r
2f920 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20  egRecord;.      
2f930 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
2f940 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79      int nGroupBy
2f950 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  ;..        expla
2f960 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
2f970 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
2f980 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
2f990 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ct && (p->selFla
2f9a0 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d  gs&SF_Distinct)=
2f9b0 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20  =0) ?.          
2f9c0 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49            "DISTI
2f9d0 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59  NCT" : "GROUP BY
2f9e0 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f  ");..        gro
2f9f0 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
2fa00 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d        nGroupBy =
2fa10 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2fa20 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
2fa30 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
2fa40 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b     j = nGroupBy;
2fa50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2fa60 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
2fa70 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2fa80 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e        if( sAggIn
2fa90 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74  fo.aCol[i].iSort
2faa0 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
2fab0 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b             nCol+
2fac0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  +;.            j
2fad0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
2fae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2faf0 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
2fb00 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
2fb10 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  pParse, nCol);. 
2fb20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2fb30 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2fb40 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
2fb50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
2fb60 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
2fb70 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c  roupBy, regBase,
2fb80 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
2fb90 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  j = nGroupBy;.  
2fba0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2fbb0 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
2fbc0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2fbd0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
2fbe0 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73  o_col *pCol = &s
2fbf0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b  AggInfo.aCol[i];
2fc00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2fc10 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2fc20 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
2fc30 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20       int r1 = j 
2fc40 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  + regBase;.     
2fc50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2fc60 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54  prCodeGetColumnT
2fc70 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20 20  oReg(pParse, .  
2fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2fca0 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
2fcb0 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
2fcc0 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  able, r1);.     
2fcd0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
2fce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fcf0 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63  }.        regRec
2fd00 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
2fd10 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
2fd20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fd30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2fd40 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
2fd50 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52  Base, nCol, regR
2fd60 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
2fd70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fd80 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e  2(v, OP_SorterIn
2fd90 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
2fda0 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65  ortingIdx, regRe
2fdb0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2fdc0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2fdd0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
2fde0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2fdf0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2fe00 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2fe10 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b   regBase, nCol);
2fe20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fe30 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
2fe40 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
2fe50 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  fo.sortingIdxPTa
2fe60 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70  b = sortPTab = p
2fe70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2fe80 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d         sortOut =
2fe90 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2fea0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
2feb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fec0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
2fed0 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62  Pseudo, sortPTab
2fee0 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29  , sortOut, nCol)
2fef0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ff00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ff10 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41  P_SorterSort, sA
2ff20 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2ff30 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  x, addrEnd);.   
2ff40 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2ff50 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73  ((v, "GROUP BY s
2ff60 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65  ort")); VdbeCove
2ff70 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
2ff80 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72   sAggInfo.useSor
2ff90 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20  tingIdx = 1;.   
2ffa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2ffb0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2ffc0 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20  e);..      }..  
2ffd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
2ffe0 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79  dex or temporary
2fff0 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 74   table used by t
30000 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74  he GROUP BY sort
30010 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e  .      ** will n
30020 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72  aturally deliver
30030 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64   rows in the ord
30040 65 72 20 72 65 71 75 69 72 65 64 20 62 79 20 74  er required by t
30050 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  he ORDER BY.    
30060 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e    ** clause, can
30070 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61  cel the ephemera
30080 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64  l table open cod
30090 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20  ed earlier..    
300a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
300b0 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
300c0 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72  ation - the corr
300d0 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c  ect answer shoul
300e0 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c  d result regardl
300f0 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73  ess..      ** Us
30100 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f  e the SQLITE_Gro
30110 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77  upByOrder flag w
30120 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ith SQLITE_TESTC
30130 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f  TRL_OPTIMIZER to
30140 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62   .      ** disab
30150 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  le this optimiza
30160 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67  tion for testing
30170 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20   purposes.  */. 
30180 20 20 20 20 20 69 66 28 20 6f 72 64 65 72 42 79       if( orderBy
30190 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  Grp && Optimizat
301a0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
301b0 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
301c0 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 28  er) .       && (
301d0 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20 73  groupBySort || s
301e0 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72  qlite3WhereIsSor
301f0 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20 20  ted(pWInfo)).   
30200 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53     ){.        sS
30210 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
30220 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30230 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
30240 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
30250 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  ortIndex);.     
30260 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
30270 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  luate the curren
30280 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
30290 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30   and store in b0
302a0 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20  , b1, b2....    
302b0 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f    ** (b0 is memo
302c0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65  ry location iBMe
302d0 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d  m+0, b1 is iBMem
302e0 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  +1, and so forth
302f0 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ).      ** Then 
30300 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72  compare the curr
30310 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
30320 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47  ms against the G
30330 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20  ROUP BY terms.  
30340 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
30350 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72  previous row cur
30360 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
30370 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20   a0, a1, a2.... 
30380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
30390 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71  drTopOfLoop = sq
303a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
303b0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
303c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
303d0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
303e0 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
303f0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
30400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
30410 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
30420 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  a, sAggInfo.sort
30430 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20  ingIdx,.        
30440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30450 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50    sortOut, sortP
30460 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
30470 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
30480 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
30490 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
304a0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
304b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
304c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
304d0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50  OP_Column, sortP
304e0 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Tab, j, iBMem+j)
304f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
30500 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
30510 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
30520 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
30530 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
30540 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
30550 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
30560 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
30570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
30580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
30590 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
305a0 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
305b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
305c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305d0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
305e0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
305f0 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
30600 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61  EYINFO);.      a
30610 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
30620 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
30630 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30640 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
30650 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20 30  Jump, addr1+1, 0
30660 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65  , addr1+1); Vdbe
30670 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
30680 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
30690 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
306a0 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
306b0 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
306c0 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69      ** Changes i
306d0 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
306e0 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
306f0 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
30700 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
30710 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
30720 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
30730 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
30740 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
30750 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
30760 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
30770 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
30780 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
30790 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
307a0 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
307b0 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
307c0 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
307d0 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
307e0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
307f0 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
30800 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
30810 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
30820 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
30830 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
30840 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
30850 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
30860 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65  rse, iBMem, iAMe
30870 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
30880 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
30890 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
308a0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
308b0 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
308c0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
308d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
308e0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
308f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30900 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
30910 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  IfPos, iAbortFla
30920 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62  g, addrEnd); Vdb
30930 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
30940 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
30950 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
30960 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
30970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30980 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
30990 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
309a0 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
309b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
309c0 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
309d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
309e0 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
309f0 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
30a00 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
30a10 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
30a20 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
30a30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
30a40 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
30a50 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
30a60 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
30a70 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
30a80 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
30a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30aa0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
30ab0 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
30ac0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
30ad0 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61  (v, "indicate da
30ae0 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f  ta in accumulato
30af0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
30b00 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  End of the loop.
30b10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
30b20 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
30b30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30b40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
30b50 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41  P_SorterNext, sA
30b60 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
30b70 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  x, addrTopOfLoop
30b80 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
30b90 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
30ba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30bb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
30bc0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
30bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
30be0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
30bf0 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20  rSortingIdx);.  
30c00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
30c10 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
30c20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
30c30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
30c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30c50 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
30c60 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
30c70 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
30c80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
30c90 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72   "output final r
30ca0 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ow"));..      /*
30cb0 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73   Jump over the s
30cc0 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20  ubroutines.     
30cd0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
30ce0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
30cf0 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  rEnd);..      /*
30d00 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
30d10 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
30d20 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
30d30 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
30d40 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
30d50 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
30d60 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
30d70 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
30d80 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
30d90 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
30da0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
30db0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
30dc0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
30dd0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
30de0 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
30df0 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
30e00 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
30e10 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
30e20 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
30e30 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
30e40 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
30e50 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
30e60 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
30e70 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
30e80 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
30e90 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
30ea0 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
30eb0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
30ec0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30ed0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
30ee0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62  _Integer, 1, iAb
30ef0 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
30f00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
30f10 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22  "set abort flag"
30f20 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
30f30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30f40 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
30f50 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
30f60 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
30f70 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75  eLabel(v, addrOu
30f80 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
30f90 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
30fa0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
30fb0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
30fc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30fd0 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
30fe0 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
30ff0 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20  tputRow+2);.    
31000 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
31010 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
31020 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62  ment((v, "Groupb
31030 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
31040 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29  or entry point")
31050 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31060 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
31070 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
31080 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69  utRow);.      fi
31090 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
310a0 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
310b0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
310c0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
310d0 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
310e0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
310f0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
31100 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
31110 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
31120 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
31130 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20  , -1, &sSort,.  
31140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31150 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20      &sDistinct, 
31160 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
31170 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
31180 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
31190 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20  drSetAbort);.   
311a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
311b0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
311c0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
311d0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
311e0 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
311f0 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
31200 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
31210 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
31220 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
31230 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
31240 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
31250 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
31260 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
31270 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
31280 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  rReset);.      r
31290 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
312a0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
312b0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
312c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
312d0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73  P_Return, regRes
312e0 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d  et);.     .    }
312f0 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
31300 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65  By.  Begin aggre
31310 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74  gate queries wit
31320 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a  hout GROUP BY: *
31330 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  /.    else {.   
31340 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65     ExprList *pDe
31350 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  l = 0;.#ifndef S
31360 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
31370 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c  COUNT.      Tabl
31380 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
31390 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d  f( (pTab = isSim
313a0 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67  pleCount(p, &sAg
313b0 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20  gInfo))!=0 ){.  
313c0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69        /* If isSi
313d0 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75  mpleCount() retu
313e0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
313f0 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
31400 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  re, then.       
31410 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74   ** the SQL stat
31420 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
31430 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a  form:.        **
31440 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
31450 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
31460 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20  OM <tbl>.       
31470 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
31480 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73  here the Table s
31490 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
314a0 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62  d represents tab
314b0 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20  le <tbl>..      
314c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
314d0 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
314e0 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74  s so common that
314f0 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64   it is optimized
31500 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a   specially. The.
31510 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f          ** OP_Co
31520 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  unt instruction 
31530 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68  is executed eith
31540 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79  er on the intkey
31550 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
31560 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
31570 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62  the data for tab
31580 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f  le <tbl> or on o
31590 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65  ne of its indexe
315a0 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a  s. It.        **
315b0 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78   is better to ex
315c0 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20  ecute the op on 
315d0 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64  an index, as ind
315e0 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a  exes are almost.
315f0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
31600 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20  s spread across 
31610 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20  less pages than 
31620 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
31630 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ing tables..    
31640 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
31650 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73  onst int iDb = s
31660 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
31670 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
31680 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
31690 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
316a0 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d  t iCsr = pParse-
316b0 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
316c0 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62  Cursor to scan b
316d0 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20  -tree */.       
316e0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
316f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31700 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
31710 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
31720 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
31730 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
31740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
31750 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65  yinfo for scanne
31760 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  d index */.     
31770 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
31780 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
31790 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
317a0 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66  index found so f
317b0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ar */.        in
317c0 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e  t iRoot = pTab->
317d0 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
317e0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
317f0 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65  of scanned b-tre
31800 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71  e */..        sq
31810 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
31820 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
31830 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
31840 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
31850 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
31860 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
31870 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  Name);..        
31880 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
31890 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73  e index that has
318a0 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e   the lowest scan
318b0 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a   cost..        *
318c0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
318d0 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74  11-04-15) Do not
318e0 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20   do a full scan 
318f0 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20  of an unordered 
31900 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
31910 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
31920 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74  13-10-03) Do not
31930 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69   count the entri
31940 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20  es in a partial 
31950 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
31960 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
31970 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79  practice the Key
31980 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77  Info structure w
31990 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
319a0 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20   It is only .   
319b0 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74       ** passed t
319c0 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65  o keep OP_OpenRe
319d0 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20  ad happy..      
319e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
319f0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
31a00 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74   ) pBest = sqlit
31a10 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
31a20 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
31a30 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
31a40 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
31a50 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
31a60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
31a70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  Idx->bUnordered=
31a80 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
31a90 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
31aa0 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20  pTab->szTabRow. 
31ab0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
31ac0 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
31ad0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
31ae0 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64  & (!pBest || pId
31af0 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73  x->szIdxRow<pBes
31b00 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20  t->szIdxRow).   
31b10 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
31b20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
31b30 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dx;.          }.
31b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31b50 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20    if( pBest ){. 
31b60 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d           iRoot =
31b70 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pBest->tnum;.  
31b80 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
31b90 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
31ba0 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
31bb0 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
31bc0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
31bd0 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
31be0 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
31bf0 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
31c00 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
31c10 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
31c20 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
31c30 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
31c40 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62  iCsr, iRoot, iDb
31c50 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
31c60 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
31c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
31c80 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
31c90 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
31ca0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
31cb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31cc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31cd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
31ce0 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66  t, iCsr, sAggInf
31cf0 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29  o.aFunc[0].iMem)
31d00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31d10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
31d20 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a  P_Close, iCsr);.
31d30 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
31d40 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73  impleCount(pPars
31d50 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b  e, pTab, pBest);
31d60 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
31d70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
31d80 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
31d90 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
31da0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
31db0 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65   query is of one
31dc0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
31dd0 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20  g forms:.       
31de0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
31df0 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
31e00 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
31e10 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
31e20 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
31e30 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31e40 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
31e50 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e   ask the code in
31e60 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65   where.c to atte
31e70 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75  mpt to sort resu
31e80 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lts.        ** a
31e90 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
31ea0 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f  n "ORDER ON x" o
31eb0 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45  r "ORDER ON x DE
31ec0 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20  SC" clause. .   
31ed0 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65       ** If where
31ee0 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72  .c is able to pr
31ef0 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f  oduce results so
31f00 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64  rted in this ord
31f10 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  er, then.       
31f20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64   ** add vdbe cod
31f30 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
31f40 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  f the processing
31f50 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20   loop after the 
31f60 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73  .        ** firs
31f70 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e  t iteration (sin
31f80 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65  ce the first ite
31f90 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
31fa0 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  op is .        *
31fb0 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
31fc0 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
31fd0 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
31fe0 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
31ff0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
32000 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20   of x, the only 
32010 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20  row required).. 
32020 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
32030 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66    ** A special f
32040 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73  lag must be pass
32050 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
32060 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69  reBegin() to sli
32070 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  ghtly.        **
32080 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72   modify behavior
32090 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
320a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
320b0 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75  **   + If the qu
320c0 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54  ery is a "SELECT
320d0 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74   min(x)", then t
320e0 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79  he loop coded by
320f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
32100 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
32110 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
32120 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
32130 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
32140 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
32150 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
32160 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
32170 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
32180 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
32190 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
321a0 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  es which.       
321b0 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72   **     index or
321c0 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29   indices to use)
321d0 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20   should place a 
321e0 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69  different priori
321f0 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ty on .        *
32200 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
32210 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
32220 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
32230 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
32240 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  es..        **  
32250 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65     Refer to code
32260 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   and comments in
32270 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74   where.c for det
32280 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ails..        */
32290 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
322a0 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a  t *pMinMax = 0;.
322b0 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20          u8 flag 
322c0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
322d0 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20  NORMAL;.        
322e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
322f0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
32300 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
32310 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20  t( flag==0 );.  
32320 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
32330 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ving==0 ){.     
32340 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d       flag = minM
32350 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66  axQuery(&sAggInf
32360 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20  o, &pMinMax);.  
32370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32380 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
32390 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26  || (pMinMax!=0 &
323a0 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72  & pMinMax->nExpr
323b0 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ==1) );..       
323c0 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
323d0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
323e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
323f0 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c  Dup(db, pMinMax,
32400 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
32410 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20  Del = pMinMax;. 
32420 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
32430 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
32440 64 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d 30 20  d || pMinMax!=0 
32450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32460 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
32470 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
32480 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
32490 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
324a0 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
324b0 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20  MIN ?1:0;.      
324c0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
324d0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
324e0 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
324f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32500 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  .  .        /* T
32510 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
32520 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
32530 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
32540 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
32550 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
32560 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
32570 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
32580 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
32590 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ow.        ** of
325a0 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20   output..       
325b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
325c0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
325d0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
325e0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20  .        pWInfo 
325f0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
32600 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
32610 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d  List, pWhere, pM
32620 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b  inMax,0,flag,0);
32630 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
32640 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
32650 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
32660 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
32670 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  el);.          g
32680 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
32690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
326a0 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
326b0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
326c0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
326d0 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d  assert( pMinMax=
326e0 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 || pMinMax->n
326f0 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
32700 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
32710 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
32720 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  nfo)>0 ){.      
32730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
32740 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57 68  oto(v, sqlite3Wh
32750 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
32760 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Info));.        
32770 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
32780 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
32790 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
327a0 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f     (flag==WHERE_
327b0 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
327c0 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
327d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
327e0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
327f0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
32800 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
32810 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
32820 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  gInfo);.      }.
32830 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
32840 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
32850 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
32860 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
32870 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51  ing, addrEnd, SQ
32880 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
32890 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
328a0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
328b0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  p, p->pEList, -1
328c0 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  , 0, 0, .       
328d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
328e0 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61  Dest, addrEnd, a
328f0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73  ddrEnd);.      s
32900 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
32910 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
32920 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
32930 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
32940 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  l(v, addrEnd);. 
32950 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66     .  } /* endif
32960 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
32970 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74   */..  if( sDist
32980 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d  inct.eTnctType==
32990 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
329a0 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20  NORDERED ){.    
329b0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
329c0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
329d0 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CT");.  }..  /* 
329e0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
329f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
32a00 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
32a10 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
32a20 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
32a30 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
32a40 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
32a50 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
32a60 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
32a70 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
32a80 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
32a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
32aa0 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20  Sort.nOBSat>0 ? 
32ab0 22 52 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f  "RIGHT PART OF O
32ac0 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52 20  RDER BY":"ORDER 
32ad0 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61  BY");.    genera
32ae0 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
32af0 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70 45  e, p, &sSort, pE
32b00 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65  List->nExpr, pDe
32b10 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  st);.  }..  /* J
32b20 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
32b30 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f   this query.  */
32b40 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
32b50 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45  solveLabel(v, iE
32b60 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  nd);..  /* The S
32b70 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
32b80 6f 64 65 64 2e 20 49 66 20 74 68 65 72 65 20 69  oded. If there i
32b90 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  s an error in th
32ba0 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72  e Parse structur
32bb0 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  e,.  ** set the 
32bc0 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 31  return code to 1
32bd0 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 20 2a  . Otherwise 0. *
32be0 2f 0a 20 20 72 63 20 3d 20 28 70 50 61 72 73 65  /.  rc = (pParse
32bf0 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a  ->nErr>0);..  /*
32c00 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
32c10 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
32c20 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
32c30 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
32c40 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
32c50 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
32c60 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
32c70 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69  ct_end:.  explai
32c80 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72  nSetInteger(pPar
32c90 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69  se->iSelectId, i
32ca0 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29  RestoreSelectId)
32cb0 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  ;..  /* Identify
32cc0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
32cd0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
32ce0 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65  SELECT are to be
32cf0 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
32d00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32d10 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73  K && pDest->eDes
32d20 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
32d30 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
32d40 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
32d50 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
32d60 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  t);.  }..  sqlit
32d70 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
32d80 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
32d90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
32da0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29   sAggInfo.aFunc)
32db0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
32dc0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45  E_ENABLED.  SELE
32dd0 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
32de0 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73  ,p,("end process
32df0 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72  ing\n"));.  pPar
32e00 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
32e10 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  t--;.#endif.  re
32e20 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.