/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 478e95d424bb86d34c7c95d20872cbd78df97af5f83c3fd7de55d5b2413f927d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
1000: 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
1010: 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53  e->db,TK_ASTERIS
1020: 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  K,0));.  }.  pNe
1030: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  w->pEList = pELi
1040: 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  st;.  pNew->op =
1050: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e   TK_SELECT;.  pN
1060: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73  ew->selFlags = s
1070: 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  elFlags;.  pNew-
1080: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
1090: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
10a0: 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
10b0: 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e 65 77  E_ENABLED.  pNew
10c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20  ->zSelName[0] = 
10d0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65 77  0;.#endif.  pNew
10e0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
10f0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1100: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
1110: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  = -1;.  pNew->nS
1120: 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
1130: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1140: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1150: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
1160: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 53 72  >db, sizeof(*pSr
1170: 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  c));.  pNew->pSr
1180: 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77  c = pSrc;.  pNew
1190: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
11a0: 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  e;.  pNew->pGrou
11b0: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
11c0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
11d0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65  = pHaving;.  pNe
11e0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  w->pOrderBy = pO
11f0: 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  rderBy;.  pNew->
1200: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  pPrior = 0;.  pN
1210: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ew->pNext = 0;. 
1220: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
1230: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
1240: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1250: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  t;.  pNew->pWith
1260: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1270: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
1280: 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  imit!=0 || pPars
1290: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 50 61  e->nErr>0 || pPa
12a0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
12b0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
12c0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
12d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
12e0: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70     clearSelect(p
12f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c  Parse->db, pNew,
1300: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29   pNew!=&standin)
1310: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1330: 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21  ert( pNew->pSrc!
1340: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
1350: 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  rr>0 );.  }.  as
1360: 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61  sert( pNew!=&sta
1370: 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e  ndin );.  return
1380: 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45   pNew;.}..#if SE
1390: 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
13a0: 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  D./*.** Set the 
13b0: 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74  name of a Select
13c0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
13d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
13e0: 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20  Name(Select *p, 
13f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1400: 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a  e){.  if( p && z
1410: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1420: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1430: 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29  eof(p->zSelName)
1440: 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22  , p->zSelName, "
1450: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
1460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1470: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
1480: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
1490: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
14a0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
14b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
14d0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
14e0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
14f0: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
1500: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
1510: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1520: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
1530: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
1540: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
1550: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1560: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1570: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1580: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1590: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
15a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
15b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
15c0: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
15d0: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
15e0: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
15f0: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
1600: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
1610: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
1620: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
1630: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
1640: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1660: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1670: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1680: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1690: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
16a0: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
16b0: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
16c0: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
16d0: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
16e0: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
16f0: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
1700: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
1710: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
1720: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
1730: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
1740: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
1750: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1760: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1770: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1780: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1790: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17a0: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
17b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
17c0: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
17d0: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
17e0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
17f0: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
1800: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1830: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
1840: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1850: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1860: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1870: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1880: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1890: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
18a0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
18b0: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
18c0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
18d0: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
18e0: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
18f0: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
1900: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
1910: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
1920: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
1930: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
1940: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
1950: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1960: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1970: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1980: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1990: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
19a0: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
19b0: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
19c0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
19e0: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
19f0: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1a10: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
1a20: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
1a30: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
1a50: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1a60: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1a70: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1a80: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1a90: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1ab0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1ac0: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1ae0: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1af0: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
1b00: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
1b10: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
1b20: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
1b30: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
1b40: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
1b50: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1b60: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1b70: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1b80: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1b90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1ba0: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1bb0: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1bc0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1bd0: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1be0: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1bf0: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1c10: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
1c20: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
1c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c40: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1c50: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
1c60: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
1c70: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
1c80: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
1c90: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
1ca0: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
1cb0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1cc0: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
1cd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ce0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
1cf0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
1d00: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
1d10: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1d20: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
1d30: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
1d40: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
1d50: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
1d60: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
1d70: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
1d80: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
1d90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1da0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1db0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1dc0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1dd0: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
1de0: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
1df0: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
1e00: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1e10: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
1e20: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1e30: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
1e40: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
1e50: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
1e60: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1e80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1e90: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1ea0: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1eb0: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1ec0: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1ed0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1ee0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1ef0: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1f00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1f10: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1f20: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1f30: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1f40: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1f50: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1f60: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1f70: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1f80: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1f90: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1fa0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1fb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1fc0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1fe0: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1ff0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
2000: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
2010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
2020: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2030: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
2040: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
2050: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
2060: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
2070: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
2080: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
2090: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
20a0: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
20b0: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
20c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
20d0: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
20e0: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
20f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
2100: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
2110: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
2120: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
2130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
2140: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
2150: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2160: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2170: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2180: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2190: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
21a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
21b0: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
21c0: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
21d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
21e0: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
21f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
2200: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
2210: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2230: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
2240: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
2250: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2260: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2270: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2280: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2290: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
22a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
22b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22c0: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
22d0: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
22e0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
22f0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2300: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
2310: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
2320: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
2330: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
2340: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
2350: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2360: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2370: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2380: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2390: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
23a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
23b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
23c0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
23d0: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
23e0: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
23f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2400: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2430: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2440: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
2450: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2460: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2470: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2480: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2490: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
24a0: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
24b0: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
24c0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
24d0: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
24e0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
24f0: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
2500: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
2510: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
2520: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
2530: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
2540: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
2550: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2560: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2570: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2580: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2590: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
25a0: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
25b0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
25c0: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
25d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
2600: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2610: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2630: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
2640: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2650: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2680: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2690: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
26a0: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
26d0: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2710: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
2720: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2730: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
2740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2750: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2760: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2770: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2780: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
27b0: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
27c0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
27d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
27e0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
27f0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
2800: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2810: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2820: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
2830: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
2840: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
2850: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2870: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2890: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
28a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
28b0: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
28c0: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
28d0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
28e0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
28f0: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
2900: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
2910: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2920: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
2930: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
2940: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
2950: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2960: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a  _EQ, pE1, pE2);.
2970: 20 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f    if( pEq && isO
2980: 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  uterJoin ){.    
2990: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
29a0: 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  pEq, EP_FromJoin
29b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
29c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29d0: 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  pEq, EP_TokenOnl
29e0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
29f0: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2a20: 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  Eq->iRightJoinTa
2a30: 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e  ble = (i16)pE2->
2a40: 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  iTable;.  }.  *p
2a50: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2a60: 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57  ExprAnd(db, *ppW
2a70: 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f  here, pEq);.}../
2a80: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
2a90: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2aa0: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
2ab0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
2ac0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
2ad0: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
2ae0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
2af0: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
2b00: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
2b10: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2b20: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
2b30: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
2b40: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
2b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
2b60: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
2b70: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
2b80: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
2b90: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
2ba0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
2bb0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
2bc0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
2bd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2be0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
2bf0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
2c00: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
2c10: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
2c20: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
2c30: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
2c40: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
2c50: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
2c60: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
2c70: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
2c80: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
2c90: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2ca0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
2cb0: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
2cc0: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
2cd0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2ce0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
2cf0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2d00: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
2d10: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
2d20: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
2d30: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
2d40: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
2d50: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
2d60: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
2d70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
2d80: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
2d90: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
2da0: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
2db0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
2dc0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
2dd0: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
2de0: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
2df0: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
2e00: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2e10: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
2e20: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
2e30: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
2e40: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
2e50: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
2e60: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
2e70: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
2e80: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
2e90: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
2ea0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
2eb0: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
2ec0: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
2ed0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
2ee0: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
2ef0: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
2f00: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
2f10: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
2f20: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
2f30: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
2f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2f50: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
2f60: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
2f70: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
2f80: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2f90: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
2fa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2fb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2fc0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
2fd0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2fe0: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2ff0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
3000: 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52  duce);.    p->iR
3010: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
3020: 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20  (i16)iTable;.   
3030: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3040: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3050: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3060: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3070: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3080: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3090: 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45          setJoinE
30a0: 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  xpr(p->x.pList->
30b0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
30c0: 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
30d0: 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78   }.    setJoinEx
30e0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
30f0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
3100: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3110: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3120: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3130: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3140: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3150: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3160: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3170: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3180: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3190: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
31a0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
31b0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
31c0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
31d0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
31e0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
31f0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
3200: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3210: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3220: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3230: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3240: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3250: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3260: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3270: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3280: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3290: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
32a0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
32b0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
32c0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
32d0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
32e0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
32f0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
3300: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3310: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3320: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3330: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3340: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3350: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3360: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3370: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3380: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3390: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
33a0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
33b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33c0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
33d0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
33e0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
33f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3420: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3430: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3460: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3470: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3480: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3490: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
34a0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
34b0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
34c0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
34d0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
34e0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
34f0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3500: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3510: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3520: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3530: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3540: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3550: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3560: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
3570: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
3580: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
3590: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
35a0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
35b0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
35c0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
35d0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
35e0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
35f0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3600: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3610: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3620: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3630: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3640: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3650: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3660: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3670: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3680: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3690: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
36a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36b0: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
36c0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
36d0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
36e0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
36f0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3710: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3720: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3730: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3740: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3750: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3760: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3770: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3780: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3790: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
37a0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
37b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
37c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
37d0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
37e0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
37f0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3800: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3810: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3820: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3830: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3840: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3850: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3860: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3870: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3880: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3890: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
38a0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
38b0: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
38c0: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
38d0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
38e0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
38f0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3900: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3930: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3950: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3960: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3970: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3980: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3990: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
39a0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
39b0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
39c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
39d0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
39e0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
39f0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3a00: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3a10: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3a20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3a30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
3a40: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
3a50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3a60: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
3a70: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
3a80: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
3a90: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
3aa0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
3ab0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
3ac0: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
3ad0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
3ae0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
3af0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
3b00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
3b10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3b20: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
3b30: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
3b40: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
3b50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
3b60: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
3b70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3b80: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
3b90: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
3ba0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
3bb0: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
3bc0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3bd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
3be0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
3bf0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
3c00: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
3c10: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
3c20: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
3c30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3c40: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
3c50: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
3c60: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
3c70: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
3c80: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
3c90: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
3ca0: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
3cb0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
3cc0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
3cd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
3ce0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3cf0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3d00: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
3d10: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
3d20: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
3d30: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
3d40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
3d60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3d70: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
3d80: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
3d90: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3da0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
3db0: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
3dc0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
3dd0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
3de0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
3df0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
3e00: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
3e10: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
3e20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3e30: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
3e40: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3e50: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3e60: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
3e70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
3e80: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
3ea0: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
3eb0: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
3ec0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
3ed0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
3ee0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
3ef0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
3f00: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
3f10: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
3f20: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
3f30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3f40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3f50: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
3f60: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
3f70: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
3f80: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
3f90: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
3fa0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
3fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fd0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3fe0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3ff0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
4000: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4030: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4050: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
4060: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
4070: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
4080: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
4090: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
40a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
40b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
40c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
40d0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
40e0: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
40f0: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
4100: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
4110: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
4120: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
4130: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
4140: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
4150: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
4160: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
4170: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
4180: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a  o the end */.);.
4190: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
41a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70  code that will p
41b0: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69  ush the record i
41c0: 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44  n registers regD
41d0: 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72  ata.** through r
41e0: 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f  egData+nData-1 o
41f0: 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a  nto the sorter..
4200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4210: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
4220: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4230: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
4240: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
4250: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
4260: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4270: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f  tion about the O
4280: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
4290: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
42a0: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
42b0: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
42c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
42d0: 74 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20  t regData,      
42e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
42f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4300: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
4310: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
4320: 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20  gData,       /* 
4330: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4340: 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f  olding data befo
4350: 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20  re packing */.  
4360: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
4370: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4380: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
4390: 74 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a  the data array *
43a0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
43b0: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
43c0: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
43d0: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
43e0: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
43f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4400: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4430: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4440: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
4450: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
4460: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4470: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
4480: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
4490: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
44a0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
44b0: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
44c0: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
44d0: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
44e0: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
4510: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4520: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
4560: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4570: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
4580: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
45b0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
45c0: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
45d0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
4600: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
4610: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
4640: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
4650: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
4660: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
4690: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
46a0: 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62  rt( bSeq==0 || b
46b0: 53 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Seq==1 );.  asse
46c0: 72 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20  rt( nData==1 || 
46d0: 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67  regData==regOrig
46e0: 44 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44  Data || regOrigD
46f0: 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
4700: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
4710: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
4720: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
4730: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
4740: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70  = regData - nExp
4750: 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73  r - bSeq;.  }els
4760: 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  e{.    regBase =
4770: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
4780: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
4790: 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20  Mem += nBase;.  
47a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  }.  assert( pSel
47b0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20  ect->iOffset==0 
47c0: 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  || pSelect->iLim
47d0: 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69  it!=0 );.  iLimi
47e0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  t = pSelect->iOf
47f0: 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e  fset ? pSelect->
4800: 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c  iOffset+1 : pSel
4810: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70  ect->iLimit;.  p
4820: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20  Sort->labelDone 
4830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4840: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c  eLabel(v);.  sql
4850: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4860: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
4870: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65  rt->pOrderBy, re
4880: 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61  gBase, regOrigDa
4890: 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
48b0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20  LITE_ECEL_DUP | 
48c0: 28 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51  (regOrigData? SQ
48d0: 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20  LITE_ECEL_REF : 
48e0: 30 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20  0));.  if( bSeq 
48f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4900: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
4910: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
4920: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4930: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  e+nExpr);.  }.  
4940: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  if( nPrefixReg==
4950: 30 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a  0 && nData>0 ){.
4960: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4970: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
4980: 72 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65  regData, regBase
4990: 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61  +nExpr+bSeq, nDa
49a0: 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ta);.  }.  sqlit
49b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
49c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
49d0: 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e  egBase+nOBSat, n
49e0: 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67  Base-nOBSat, reg
49f0: 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e  Record);.  if( n
4a00: 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69  OBSat>0 ){.    i
4a10: 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20  nt regPrevKey;  
4a20: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f   /* The first nO
4a30: 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  BSat columns of 
4a40: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
4a50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4a60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64  First;    /* Add
4a70: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49  ress of the OP_I
4a80: 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  fNot opcode */. 
4a90: 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20     int addrJmp; 
4aa0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4ab0: 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f  of the OP_Jump o
4ac0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62  pcode */.    Vdb
4ad0: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f  eOp *pOp;      /
4ae0: 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70  * Opcode that op
4af0: 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a  ens the sorter *
4b00: 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20  /.    int nKey; 
4b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b20: 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79  r of sorting key
4b30: 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64   columns, includ
4b40: 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20  ing OP_Sequence 
4b50: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
4b60: 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  pKI;     /* Orig
4b70: 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20  inal KeyInfo on 
4b80: 74 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65  the sorter table
4b90: 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76   */..    regPrev
4ba0: 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Key = pParse->nM
4bb0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
4bc0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d  ->nMem += pSort-
4bd0: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65  >nOBSat;.    nKe
4be0: 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72  y = nExpr - pSor
4bf0: 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71  t->nOBSat + bSeq
4c00: 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29  ;.    if( bSeq )
4c10: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
4c20: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
4c30: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
4c40: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  t, regBase+nExpr
4c50: 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ); .    }else{. 
4c60: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
4c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c80: 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p1(v, OP_Sequenc
4c90: 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45  eTest, pSort->iE
4ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
4cb0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4cc0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4cd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4ce0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76  Compare, regPrev
4cf0: 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53  Key, regBase, pS
4d00: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4d10: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
4d20: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
4d30: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
4d40: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
4d50: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4d60: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
4d70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79    pOp->p2 = nKey
4d80: 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b   + nData;.    pK
4d90: 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  I = pOp->p4.pKey
4da0: 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Info;.    memset
4db0: 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72  (pKI->aSortOrder
4dc0: 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64  , 0, pKI->nField
4dd0: 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a  ); /* Makes OP_J
4de0: 75 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62  ump below testab
4df0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
4e00: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4e10: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c   -1, (char*)pKI,
4e20: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
4e30: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d    testcase( pKI-
4e40: 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a 20 20  >nXField>2 );.  
4e50: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
4e60: 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
4e70: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4e80: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4e90: 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20  , nOBSat,.      
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69 65 6c       pKI->nXFiel
4ed0: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
4ee0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
4ef0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
4f00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f10: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
4f20: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
4f30: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
4f40: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4f50: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
4f60: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
4f70: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
4f80: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4f90: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
4fa0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
4fb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4fc0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
4fd0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
4fe0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
4ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5000: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
5010: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
5020: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
5030: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
5040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5050: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
5060: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
5070: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
5080: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5090: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
50a0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
50b0: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
50c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50d0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
50e0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
50f0: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
5100: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5110: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5120: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
5130: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
5140: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5150: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
5160: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
5170: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
5180: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
5190: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
51a0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
51b0: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
51c0: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
51d0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
51e0: 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73            regBas
51f0: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
5200: 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69  nOBSat);.  if( i
5210: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
5220: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72   addr;.    int r
5230: 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69  1 = 0;.    /* Fi
5240: 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e  ll the sorter un
5250: 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  til it contains 
5260: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74  LIMIT+OFFSET ent
5270: 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d  ries.  (The iLim
5280: 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  it.    ** regist
5290: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
52a0: 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20  d with value of 
52b0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20  LIMIT+OFFSET.)  
52c0: 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72  After the sorter
52d0: 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70  .    ** fills up
52e0: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61  , delete the lea
52f0: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
5300: 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63  sorter after eac
5310: 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a  h insert..    **
5320: 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68   Thus we never h
5330: 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  old more than th
5340: 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72  e LIMIT+OFFSET r
5350: 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74  ows in memory at
5360: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64   once */.    add
5370: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
5380: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
5390: 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20  tZero, iLimit); 
53a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
53b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
53c0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
53d0: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
53e0: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
53f0: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5400: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5410: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
5420: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
5430: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5440: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
5450: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
5460: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
5470: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
5480: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
5490: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
54a0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
54b0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
54c0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
54d0: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
54e0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
54f0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5500: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5510: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
5520: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
5530: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
5540: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
5550: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
5560: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
5570: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
5580: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
5590: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
55a0: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
55b0: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
55c0: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
55d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
55e0: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
55f0: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5600: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5610: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
5620: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
5630: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
5640: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5650: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
5660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5670: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5680: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
5690: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
56a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
56b0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
56c0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
56d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
56e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
56f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5700: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
5710: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
5720: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
5730: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
5740: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
5750: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
5760: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5770: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5780: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
5790: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
57a0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
57b0: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
57c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
57d0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
57e0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
57f0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5800: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5810: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
5820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5830: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
5840: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
5850: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
5860: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
5870: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
5880: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5890: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
58a0: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
58b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
58c0: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
58d0: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
58e0: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
58f0: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5900: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5910: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
5920: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
5930: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
5940: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
5950: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
5960: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
5970: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
5980: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
5990: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
59a0: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
59b0: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
59c0: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
59d0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
59e0: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
59f0: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
5a00: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
5a10: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
5a20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5a30: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
5a40: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5a50: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
5a60: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
5a70: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
5a80: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
5a90: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
5aa0: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
5ab0: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
5ac0: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
5ad0: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
5ae0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
5af0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5b00: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
5b10: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
5b20: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
5b30: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
5b40: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
5b50: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
5b60: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
5b70: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5b80: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5ba0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
5bb0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
5bc0: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
5bd0: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
5be0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5bf0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5c00: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
5c10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5c20: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
5c30: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20  sert, iTab, r1, 
5c40: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
5c50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5c60: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
5c70: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
5c80: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5c90: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
5ca0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5cb0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5cc0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5cd0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5ce0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5cf0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5d00: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
5d10: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
5d20: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
5d30: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
5d40: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
5d50: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
5d60: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72  this row.  If sr
5d70: 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20  cTab is.** zero 
5d80: 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61  or more, then da
5d90: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
5da0: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
5db0: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
5dc0: 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20   .** to get the 
5dd0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
5de0: 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74  s and the collat
5df0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
5e00: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
5e10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
5e20: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
5e30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5e40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5e50: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5e60: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
5e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5e80: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
5e90: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
5ea0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
5eb0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
5ec0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5ed0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
5ee0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
5ef0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5f00: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5f10: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5f20: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5f30: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5f40: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5f50: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5f60: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5f70: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5f80: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5f90: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5fa0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5fb0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5fc0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
5fd0: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
5fe0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
5ff0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
6000: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
6010: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
6020: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
6030: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
6040: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
6050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
6060: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
6070: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
6080: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
6090: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
60a0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
60b0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
60c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
60d0: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
60e0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
60f0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6100: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6110: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
6120: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
6130: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6140: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6150: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
6160: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
6170: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
6180: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
6190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
61a0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
61b0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
61c0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
61d0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
61e0: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
61f0: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
6200: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 2f  egResult */..  /
6210: 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65  * Usually, regRe
6220: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
6230: 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  t cell in an arr
6240: 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  ay of memory cel
6250: 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  ls.  ** containi
6260: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ng the current r
6270: 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68  esult row. In th
6280: 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67 20  is case regOrig 
6290: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
62a0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48  ** same value. H
62b0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 72  owever, if the r
62c0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
62d0: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72   sent to the sor
62e0: 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61  ter, the.  ** va
62f0: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70  lues for any exp
6300: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
6310: 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74  e also part of t
6320: 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20  he sort-key are 
6330: 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f  omitted.  ** fro
6340: 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e  m this array. In
6350: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
6360: 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ig is set to zer
6370: 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  o.  */.  int reg
6380: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
6390: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
63a0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
63b0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20  current results 
63c0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
63d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
63e0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
63f0: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c  ory holding full
6400: 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a   result (or 0) *
6410: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
6420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
6430: 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69  st!=0 );.  hasDi
6440: 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e  stinct = pDistin
6450: 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e  ct ? pDistinct->
6460: 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52  eTnctType : WHER
6470: 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
6480: 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20  .  if( pSort && 
6490: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d  pSort->pOrderBy=
64a0: 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a  =0 ) pSort = 0;.
64b0: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26    if( pSort==0 &
64c0: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
64d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  {.    assert( iC
64e0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
64f0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6500: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
6510: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tinue);.  }..  /
6520: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
6530: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
6540: 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  */.  nResultCol 
6550: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
6560: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
6570: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
6580: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
6590: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
65a0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
65b0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
65c0: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
65d0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
65e0: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
65f0: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
6600: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6610: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
6620: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
6630: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
6640: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
6650: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
6660: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
6670: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
6680: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
6690: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
66a0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
66b0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
66c0: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
66d0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
66e0: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
66f0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
6700: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
6710: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
6720: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
6730: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
6740: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
6750: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
6760: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
6770: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
6780: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
6790: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
67a0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
67b0: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
67c0: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
67d0: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
67e0: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
67f0: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
6800: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
6810: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6820: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
6830: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
6840: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
6850: 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73  regOrig = regRes
6860: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  ult = pDest->iSd
6870: 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62  st;.  if( srcTab
6880: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
6890: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
68a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
68b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
68c0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
68d0: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
68e0: 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  lt+i);.      Vdb
68f0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
6900: 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ", pEList->a[i].
6910: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
6920: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6930: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
6940: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
6950: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
6960: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
6970: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
6980: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
6990: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
69a0: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
69b0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
69c0: 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67  .    u8 ecelFlag
69d0: 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  s;.    if( eDest
69e0: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
69f0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6a00: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6a10: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6a20: 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49  ecelFlags = SQLI
6a30: 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20  TE_ECEL_DUP;.   
6a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63   }else{.      ec
6a50: 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  elFlags = 0;.   
6a60: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
6a70: 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d   && hasDistinct=
6a80: 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  =0 && eDest!=SRT
6a90: 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65  _EphemTab && eDe
6aa0: 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  st!=SRT_Table ){
6ab0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61  .      /* For ea
6ac0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
6ad0: 20 70 45 4c 69 73 74 20 74 68 61 74 20 69 73 20   pEList that is 
6ae0: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
6af0: 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20  ression in.     
6b00: 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
6b10: 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d 3e   clause (pSort->
6b20: 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20 74  pOrderBy), set t
6b30: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20  he associated . 
6b40: 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42 79       ** iOrderBy
6b50: 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65  Col value to one
6b60: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 69   more than the i
6b70: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44 45  ndex of the ORDE
6b80: 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20 65  R BY .      ** e
6b90: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e  xpression within
6ba0: 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74 68   the sort-key th
6bb0: 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  at pushOntoSorte
6bc0: 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  r() will generat
6bd0: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  e..      ** This
6be0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 45 4c 69   allows the pELi
6bf0: 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f  st field to be o
6c00: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
6c10: 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20  sorted record,. 
6c20: 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73       ** saving s
6c30: 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63  pace and CPU cyc
6c40: 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65  les.  */.      e
6c50: 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c  celFlags |= (SQL
6c60: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
6c70: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
6c80: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  );.      for(i=p
6c90: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c  Sort->nOBSat; i<
6ca0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
6cb0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6cc0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
6cd0: 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53       if( (j = pS
6ce0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ort->pOrderBy->a
6cf0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
6d00: 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
6d10: 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d      pEList->a[j-
6d20: 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  1].u.x.iOrderByC
6d30: 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e  ol = i+1-pSort->
6d40: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20  nOBSat;.        
6d50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6d60: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
6d70: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
6d80: 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65  ==SRT_Set || eDe
6d90: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20  st==SRT_Mem .   
6da0: 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74          || eDest
6db0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6dc0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  || eDest==SRT_Ou
6dd0: 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20  tput );.    }.  
6de0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 73    nResultCol = s
6df0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
6e00: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70 45  prList(pParse,pE
6e10: 4c 69 73 74 2c 72 65 67 52 65 73 75 6c 74 2c 30  List,regResult,0
6e20: 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d  ,ecelFlags);.  }
6e30: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
6e40: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
6e50: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
6e60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6e70: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
6e80: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
6e90: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
6ea0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
6eb0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
6ec0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
6ed0: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
6ee0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74  inct ){.    swit
6ef0: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
6f00: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
6f10: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
6f20: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
6f30: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
6f40: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
6f50: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
6f60: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
6f70: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
6f80: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
6f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6fa0: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
6fb0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
6fc0: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
6fd0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
6fe0: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
6ff0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
7000: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7010: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
7020: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
7030: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
7040: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
7050: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
7060: 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20  esultCol;..     
7070: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
7080: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
7090: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
70a0: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
70b0: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
70c0: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
70d0: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
70e0: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
70f0: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
7100: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
7110: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
7120: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
7130: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
7140: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
7150: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
7160: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
7170: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
7180: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
7190: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
71a0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
71b0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
71c0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
71d0: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
71e0: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
71f0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
7200: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
7210: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
7220: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
7230: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
7240: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
7250: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
7260: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
7270: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
7280: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
7290: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20  ResultCol;.     
72a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
72b0: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
72c0: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
72d0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
72e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
72f0: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
7300: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
7310: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
7320: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
7330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7340: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
7350: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
7360: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
7370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
7380: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7390: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
73a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
73b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
73c0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
73d0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
73e0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
73f0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
7400: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
7410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7420: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7430: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
7440: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
7450: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
7460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7470: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
7480: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
7490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
74a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
74b0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
74c0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
74d0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
74e0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
74f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7500: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
7510: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
7520: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
7530: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7540: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7550: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
7560: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
7570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7580: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
7590: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
75a0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
75b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
75c0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
75d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
75e0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
75f0: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
7600: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
7610: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
7620: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
7630: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
7640: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
7650: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7670: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
7680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7690: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
76a0: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
76b0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
76c0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
76d0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
76e0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
76f0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
7700: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
7710: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
7720: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
7730: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
7740: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
7750: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
7760: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
7770: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
7780: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
7790: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
77a0: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
77b0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
77c0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
77d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
77e0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
77f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7800: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
7810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7820: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
7830: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7840: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
7850: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7860: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7870: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7880: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
7890: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
78a0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
78b0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
78c0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
78d0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
78e0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
78f0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
7900: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
7910: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
7920: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
7930: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
7940: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7950: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
7960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7970: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7980: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
7990: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
79a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
79b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
79c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
79d0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
79e0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
79f0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
7a00: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
7a10: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
7a20: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
7a30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7a40: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7a50: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7a60: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7a70: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
7a80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7a90: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7aa0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7ab0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ac0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7ad0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7ae0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
7af0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
7b00: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7b10: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
7b20: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7b30: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7b40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7b50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7b60: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7b70: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7b80: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7b90: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7ba0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7bb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7bc0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7bd0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7be0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
7bf0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
7c00: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
7c10: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
7c20: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
7c30: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
7c40: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7c50: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7c60: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7c70: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
7c80: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7c90: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7ca0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7cb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7cc0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7cd0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7ce0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7cf0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7d00: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7d10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7d20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
7d30: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7d40: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7d50: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7d60: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7d70: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
7d80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7d90: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7db0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7dc0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7dd0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
7de0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
7df0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7e00: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
7e10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
7e20: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7e30: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7e40: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7e50: 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78  t, p, r1+nPrefix
7e60: 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31 2c  Reg,regResult,1,
7e70: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7e80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7e90: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
7ea0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7eb0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
7ec0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ed0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7ee0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
7ef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f00: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7f10: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7f20: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7f30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7f40: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7f50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7f60: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7f70: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
7f80: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7f90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
7fa0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
7fb0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
7fc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7fd0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7fe0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
7ff0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
8000: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
8010: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
8020: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
8030: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
8040: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
8050: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
8060: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
8070: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
8080: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
8090: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
80a0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
80b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
80c0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Set: {.      if
80d0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
80e0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
80f0: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
8100: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
8110: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
8120: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
8130: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
8140: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
8150: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
8160: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
8170: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
8180: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
8190: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
81a0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
81b0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
81c0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
81d0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
81e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
81f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
8200: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8210: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
8220: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
8230: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
8240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8250: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
8260: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8270: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  se);.        ass
8280: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c  ert( sqlite3Strl
8290: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
82a0: 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f  Sdst)==nResultCo
82b0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
82c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
82d0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
82e0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
82f0: 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20  ultCol, .       
8300: 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
8310: 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c  zAffSdst, nResul
8320: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8330: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8340: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8350: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8360: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8380: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8390: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
83a0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
83b0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
83c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
83d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
83e0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
83f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8400: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8410: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
8420: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
8430: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
8440: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
8450: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
8460: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
8470: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8480: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8490: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
84a0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
84b0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
84c0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
84d0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
84e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
84f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8500: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
8510: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
8520: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
8530: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
8540: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
8550: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
8560: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
8570: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
8580: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
8590: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
85a0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
85b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
85c0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
85d0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
85e0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
85f0: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
8600: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
8610: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
8620: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
8630: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
8640: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
8650: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
8660: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
8670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8680: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
8690: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
86a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
86b0: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
86c0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
86d0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
86e0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
86f0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
8700: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
8710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8720: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
8730: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8740: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
8750: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
8760: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
8770: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
8780: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
8790: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
87a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
87b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
87c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
87d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
87e0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
87f0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8800: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
8810: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
8820: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
8830: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
8840: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
8850: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
8860: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
8890: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
88a0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
88b0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
88c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
88d0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
88e0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
88f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8910: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
8920: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
8930: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8950: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
8960: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
8970: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8980: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
8990: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
89a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
89b0: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
89c0: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
89d0: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
89e0: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
89f0: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
8a00: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
8a10: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
8a20: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
8a30: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
8a40: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
8a50: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
8a60: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
8a70: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
8a80: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
8a90: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
8aa0: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
8ab0: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
8ac0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
8ad0: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
8ae0: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
8af0: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
8b00: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
8b10: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
8b20: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
8b30: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
8b40: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
8b50: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
8b60: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
8b70: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
8b80: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
8b90: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
8ba0: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
8bb0: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
8bc0: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
8bd0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
8be0: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
8bf0: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
8c00: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
8c10: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
8c20: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8c30: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
8c40: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
8c50: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
8c60: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
8c70: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
8c80: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
8c90: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
8ca0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
8cb0: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
8cc0: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
8cd0: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
8ce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
8cf0: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
8d00: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
8d10: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
8d20: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
8d30: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
8d40: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
8d50: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
8d60: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
8d70: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
8d80: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
8d90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8db0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8dc0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8dd0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
8de0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8df0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8e00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8e10: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
8e20: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8e30: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
8e40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
8e50: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
8e60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8e70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8e80: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
8e90: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
8ea0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8eb0: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
8ec0: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
8ed0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
8ee0: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
8ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8f00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8f10: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
8f40: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
8f50: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
8f80: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8f90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8fa0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
8fb0: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
8fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8fd0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8fe0: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
8ff0: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
9000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9010: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9020: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9030: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
9040: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
9050: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
9060: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
9070: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9080: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
9090: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
90a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
90b0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
90c0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
90d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
90e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
90f0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
9100: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
9110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
9120: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
9130: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
9140: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
9150: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
9160: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
9170: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
9180: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
9190: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
91a0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
91b0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
91c0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
91d0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
91e0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
91f0: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
9200: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
9210: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
9220: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
9230: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9240: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
9250: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
9260: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9270: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
9280: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
9290: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
92a0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
92b0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
92c0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
92d0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
92e0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
92f0: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
9300: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
9310: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
9320: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
9330: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
9340: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
9350: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9360: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
9370: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
9380: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
9390: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
93a0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
93b0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
93c0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
93d0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
93e0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
93f0: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
9400: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
9410: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
9420: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
9430: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
9440: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
9450: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
9460: 2b 31 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  +1);.  KeyInfo *
9470: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
9480: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
9490: 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 6e  eof(KeyInfo) + n
94a0: 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20  Extra);.  if( p 
94b0: 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  ){.    p->aSortO
94c0: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  rder = (u8*)&p->
94d0: 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20  aColl[N+X];.    
94e0: 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  p->nField = (u16
94f0: 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65  )N;.    p->nXFie
9500: 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20  ld = (u16)X;.   
9510: 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62   p->enc = ENC(db
9520: 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64  );.    p->db = d
9530: 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  b;.    p->nRef =
9540: 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   1;.    memset(&
9550: 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29  p[1], 0, nExtra)
9560: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
9570: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
9580: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
9590: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61   p;.}../*.** Dea
95a0: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
95b0: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64  o object.*/.void
95c0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
95d0: 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  nref(KeyInfo *p)
95e0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
95f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
9600: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
9610: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  f--;.    if( p->
9620: 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65  nRef==0 ) sqlite
9630: 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c  3DbFreeNN(p->db,
9640: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
9650: 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69  * Make a new poi
9660: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
9670: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49  o object.*/.KeyI
9680: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
9690: 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a  nfoRef(KeyInfo *
96a0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
96b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
96c0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
96d0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Ref++;.  }.  ret
96e0: 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn p;.}..#ifdef
96f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
9700: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
9710: 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  if a KeyInfo obj
9720: 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67  ect can be chang
9730: 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  e.  The KeyInfo 
9740: 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e  object.** can on
9750: 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66  ly be changed if
9760: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20   this is just a 
9770: 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65  single reference
9780: 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a   to the object..
9790: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
97a0: 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
97b0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
97c0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
97d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79  /.int sqlite3Key
97e0: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
97f0: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74  KeyInfo *p){ ret
9800: 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20  urn p->nRef==1; 
9810: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9820: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
9830: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
9840: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
9850: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
9860: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
9870: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
9880: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
9890: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
98a0: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
98b0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
98c0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
98d0: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
98e0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
98f0: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
9900: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
9910: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
9920: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
9930: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
9940: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
9950: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
9960: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
9970: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
9980: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
9990: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
99a0: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
99b0: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
99c0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
99d0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
99e0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
99f0: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
9a00: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
9a10: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
9a20: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
9a30: 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
9a40: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
9a50: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
9a60: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
9a70: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
9a80: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
9a90: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
9aa0: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
9ab0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
9ac0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
9ad0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
9ae0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
9af0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9b00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9b10: 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74  t,     /* Form t
9b20: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
9b30: 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72  t from this Expr
9b40: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  List */.  int iS
9b50: 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f  tart,          /
9b60: 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69  * Begin with thi
9b70: 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73  s column of pLis
9b80: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  t */.  int nExtr
9b90: 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  a           /* A
9ba0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74  dd this many ext
9bb0: 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  ra columns to th
9bc0: 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e end */.){.  in
9bd0: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
9be0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
9bf0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
9c00: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
9c10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9c20: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ->db;.  int i;..
9c30: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
9c40: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
9c50: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
9c60: 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d  Alloc(db, nExpr-
9c70: 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31  iStart, nExtra+1
9c80: 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29  );.  if( pInfo )
9c90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
9ca0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
9cb0: 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29  iteable(pInfo) )
9cc0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61  ;.    for(i=iSta
9cd0: 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  rt, pItem=pList-
9ce0: 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78  >a+iStart; i<nEx
9cf0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
9d00: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
9d10: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
9d20: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
9d30: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
9d40: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
9d50: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
9d60: 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
9d70: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
9d80: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d   pInfo->aColl[i-
9d90: 69 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b  iStart] = pColl;
9da0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53  .      pInfo->aS
9db0: 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72  ortOrder[i-iStar
9dc0: 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74  t] = pItem->sort
9dd0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
9de0: 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b  .  return pInfo;
9df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  .}../*.** Name o
9e00: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9e10: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
9e20: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
9e30: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
9e40: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
9e50: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
9e60: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
9e70: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
9e80: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
9e90: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
9ea0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9eb0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
9ec0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
9ed0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
9ee0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
9ef0: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
9f00: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9f10: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
9f20: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
9f30: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9f40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
9f50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9f60: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
9f70: 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45  .** Unless an "E
9f80: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
9f90: 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65  N" command is be
9fa0: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74  ing processed, t
9fb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
9fc0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
9fd0: 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61  rwise, it adds a
9fe0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
9ff0: 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50  utput to the EQP
a000: 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72   result,.** wher
a010: 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73  e the caption is
a020: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
a030: 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20  .**   "USE TEMP 
a040: 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a  B-TREE FOR xxx".
a050: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20  **.** where xxx 
a060: 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49  is one of "DISTI
a070: 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22  NCT", "ORDER BY"
a080: 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20   or "GROUP BY". 
a090: 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a  Exactly which.**
a0a0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
a0b0: 79 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67  y the zUsage arg
a0c0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
a0d0: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d   void explainTem
a0e0: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
a0f0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
a100: 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28   *zUsage){.  if(
a110: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
a120: 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==2 ){.    Vdbe 
a130: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a140: 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  be;.    char *zM
a150: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
a160: 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
a170: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
a180: 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65   FOR %s", zUsage
a190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a1a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a1b0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a1c0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a1d0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a1e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
a1f0: 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69   Assign expressi
a200: 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61  on b to lvalue a
a210: 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f  . A second, no-o
a220: 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  p, version of th
a230: 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70  is macro.** is p
a240: 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c  rovided when SQL
a250: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a260: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69   is defined. Thi
a270: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64  s allows the cod
a280: 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53  e.** in sqlite3S
a290: 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67  elect() to assig
a2a0: 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75  n values to stru
a2b0: 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72  cture member var
a2c0: 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f  iables that.** o
a2d0: 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c  nly exist if SQL
a2e0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a2f0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
a300: 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e  without pollutin
a310: 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  g the.** code wi
a320: 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63  th #ifndef direc
a330: 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69  tives..*/.# defi
a340: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
a350: 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62  eger(a, b) a = b
a360: 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  ..#else./* No-op
a370: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
a380: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
a390: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
a3a0: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
a3b0: 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
a3c0: 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65  (y,z).# define e
a3d0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
a3e0: 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69  (y,z).#endif..#i
a3f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a400: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
a410: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a420: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
a430: 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55  _SELECT)./*.** U
a440: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
a450: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
a460: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
a470: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
a480: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
a490: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
a4a0: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
a4b0: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
a4c0: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
a4d0: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
a4e0: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f   caption is of o
a4f0: 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f  ne of the two fo
a500: 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f  rms:.**.**   "CO
a510: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
a520: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
a530: 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43  b2 (op)".**   "C
a540: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
a550: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
a560: 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42  ub2 USING TEMP B
a570: 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a  -TREE (op)".**.*
a580: 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e  * where iSub1 an
a590: 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20  d iSub2 are the 
a5a0: 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20  integers passed 
a5b0: 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  as the correspon
a5c0: 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ding.** function
a5d0: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64   parameters, and
a5e0: 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20   op is the text 
a5f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
a600: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a  f the parameter.
a610: 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ** of the same n
a620: 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74  ame. The paramet
a630: 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20  er "op" must be 
a640: 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  one of TK_UNION,
a650: 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54   TK_EXCEPT,.** T
a660: 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54  K_INTERSECT or T
a670: 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74  K_ALL. The first
a680: 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66   form is used if
a690: 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d   argument bUseTm
a6a0: 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20  p is .** false, 
a6b0: 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f  or the second fo
a6c0: 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65  rm if it is true
a6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a6e0: 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
a6f0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
a700: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
a710: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
a720: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
a730: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
a740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
a750: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
a760: 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f  K_EXCEPT etc. */
a770: 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20  .  int iSub1,   
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69     /* Subquery i
a7a0: 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  d 1 */.  int iSu
a7b0: 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b2,             
a7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71           /* Subq
a7d0: 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69  uery id 2 */.  i
a7e0: 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20  nt bUseTmp      
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a800: 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70  * True if a temp
a810: 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20   table was used 
a820: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
a830: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20  op==TK_UNION || 
a840: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
a850: 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
a860: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  T || op==TK_ALL 
a870: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
a880: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
a890: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
a8a0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
a8b0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
a8c0: 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20  ite3MPrintf(.   
a8d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c       pParse->db,
a8e0: 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55   "COMPOUND SUBQU
a8f0: 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20  ERIES %d AND %d 
a900: 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20  %s(%s)", iSub1, 
a910: 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62  iSub2,.        b
a920: 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45  UseTmp?"USING TE
a930: 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20  MP B-TREE ":"", 
a940: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29  selectOpName(op)
a950: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
a960: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
a970: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
a980: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
a990: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
a9a0: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  YNAMIC);.  }.}.#
a9b0: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
a9c0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
a9d0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
a9e0: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
a9f0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
aa00: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c  lainComposite(v,
aa10: 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  w,x,y,z).#endif.
aa20: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
aa30: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
aa40: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
aa50: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
aa60: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
aa70: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
aa80: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
aa90: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
aaa0: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
aab0: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
aac0: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
aad0: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
aae0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
aaf0: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
ab00: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
ab10: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
ab20: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
ab30: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
ab40: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
ab50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ab60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ab70: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
ab80: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
ab90: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
aba0: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
abb0: 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f  pSort,   /* Info
abc0: 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f  rmation on the O
abd0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
abe0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
abf0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ac00: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
ac10: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
ac20: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
ac30: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
ac40: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
ac50: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
ac60: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
ac90: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
aca0: 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70  nt addrBreak = p
acb0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b  Sort->labelDone;
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
acd0: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74  ump here to exit
ace0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
acf0: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
ad00: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ad10: 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20  el(v);  /* Jump 
ad20: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79  here for next cy
ad30: 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  cle */.  int add
ad40: 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63  r;.  int addrOnc
ad50: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  e = 0;.  int iTa
ad60: 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  b;.  ExprList *p
ad70: 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d  OrderBy = pSort-
ad80: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
ad90: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
ada0: 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61  eDest;.  int iPa
adb0: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
adc0: 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  arm;.  int regRo
add0: 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  w;.  int regRowi
ade0: 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  d;.  int iCol;. 
adf0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
ae00: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae20: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
ae30: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
ae40: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
ae70: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
ae80: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
ae90: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
aec0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
aed0: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
aee0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
aef0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45  List_item *aOutE
af00: 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  x = p->pEList->a
af10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  ;..  assert( add
af20: 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66  rBreak<0 );.  if
af30: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
af40: 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
af50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
af60: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
af70: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
af80: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
af90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
afa0: 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b  oto(v, addrBreak
afb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
afc0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
afd0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
afe0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62  Out);.  }.  iTab
aff0: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
b000: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
b010: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
b020: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b030: 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ine || eDest==SR
b040: 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 67  T_Mem ){.    reg
b050: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72  Rowid = 0;.    r
b060: 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69  egRow = pDest->i
b070: 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44  Sdst;.    nSortD
b080: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
b090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52   }else{.    regR
b0a0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
b0b0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
b0c0: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73  ;.    regRow = s
b0d0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
b0e0: 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75  ge(pParse, nColu
b0f0: 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61  mn);.    nSortDa
b100: 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ta = nColumn;.  
b110: 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65  }.  nKey = pOrde
b120: 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  rBy->nExpr - pSo
b130: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66  rt->nOBSat;.  if
b140: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
b150: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
b160: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
b170: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
b180: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
b190: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70      iSortTab = p
b1a0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
b1b0: 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61     if( pSort->la
b1c0: 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20  belBkOut ){.    
b1d0: 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
b1e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
b1f0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
b200: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b210: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
b220: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
b230: 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74  penPseudo, iSort
b240: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
b250: 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74   nKey+1+nSortDat
b260: 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  a);.    if( addr
b270: 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  Once ) sqlite3Vd
b280: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b290: 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64  drOnce);.    add
b2a0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
b2b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b2c0: 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62  SorterSort, iTab
b2d0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
b2e0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b2f0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
b300: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
b310: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
b320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b330: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
b340: 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65  erData, iTab, re
b350: 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54  gSortOut, iSortT
b360: 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  ab);.    bSeq = 
b370: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
b380: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
b390: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b3a0: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
b3b0: 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
b3c0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b3d0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
b3e0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
b3f0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f  ntinue);.    iSo
b400: 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  rtTab = iTab;.  
b410: 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a    bSeq = 1;.  }.
b420: 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d    for(i=0, iCol=
b430: 6e 4b 65 79 2b 62 53 65 71 3b 20 69 3c 6e 53 6f  nKey+bSeq; i<nSo
b440: 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20  rtData; i++){.  
b450: 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 20    int iRead;.   
b460: 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75   if( aOutEx[i].u
b470: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29  .x.iOrderByCol )
b480: 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d 20  {.      iRead = 
b490: 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f  aOutEx[i].u.x.iO
b4a0: 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20 20  rderByCol-1;.   
b4b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
b4c0: 65 61 64 20 3d 20 69 43 6f 6c 2b 2b 3b 0a 20 20  ead = iCol++;.  
b4d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
b4e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b4f0: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
b500: 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77 2b  , iRead, regRow+
b510: 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  i);.    VdbeComm
b520: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f  ent((v, "%s", aO
b530: 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20  utEx[i].zName ? 
b540: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
b550: 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61  : aOutEx[i].zSpa
b560: 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n));.  }.  switc
b570: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
b580: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
b590: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
b5a0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
b5b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b5c0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
b5d0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
b5e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b5f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b600: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
b610: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
b620: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b630: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b640: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
b650: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b660: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
b670: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
b680: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
b690: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b6a0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74  ( nColumn==sqlit
b6b0: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74  e3Strlen30(pDest
b6c0: 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a 20  ->zAffSdst) );. 
b6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b6e0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
b6f0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
b700: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77   nColumn, regRow
b710: 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  id,.            
b720: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
b730: 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f  t->zAffSdst, nCo
b740: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
b750: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
b760: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
b770: 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  se, regRow, nCol
b780: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
b790: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
b7a0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
b7b0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
b7c0: 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  d, regRow, nColu
b7d0: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
b7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b7f0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
b800: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
b810: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
b820: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
b830: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
b840: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
b850: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
b860: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
b870: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b880: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
b890: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
b8a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
b8b0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
b8c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b8d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
b8e0: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
b8f0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
b900: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
b910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b920: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
b930: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
b940: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
b950: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b960: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
b970: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
b980: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
b990: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b9a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b9b0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b9c0: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
b9d0: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
b9e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b9f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
ba00: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
ba10: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20   eDest==SRT_Set 
ba20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ba30: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
ba40: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
ba50: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d   nColumn);.    }
ba60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
ba70: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ba80: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
ba90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
baa0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
bab0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
bac0: 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  wid);.  }.  /* T
bad0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
bae0: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
baf0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
bb00: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
bb10: 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f  inue);.  if( pSo
bb20: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
bb30: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
bb40: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
bb50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bb60: 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54  P_SorterNext, iT
bb70: 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43  ab, addr); VdbeC
bb80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65  overage(v);.  }e
bb90: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
bba0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bbb0: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
bbc0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
bbd0: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (v);.  }.  if( p
bbe0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
bbf0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
bc00: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
bc10: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
bc20: 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rn);.  sqlite3Vd
bc30: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
bc40: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a  , addrBreak);.}.
bc50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
bc60: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
bc70: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
bc80: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
bc90: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
bca0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
bcb0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
bcc0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
bcd0: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
bce0: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ler..**.** Also 
bcf0: 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
bd00: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
bd10: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61  returned value a
bd20: 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a  nd return that.*
bd30: 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73  * result in *pEs
bd40: 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  tWidth..**.** Th
bd50: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
bd60: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
bd70: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
bd80: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
bd90: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
bda0: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
bdb0: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
bdc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
bdd0: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
bde0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
bdf0: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
be00: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
be10: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
be20: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
be30: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
be40: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
be50: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
be60: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
be70: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
be80: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
be90: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
bea0: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
beb0: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
bec0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
bed0: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
bee0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
bef0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
bf00: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
bf10: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
bf20: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
bf30: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
bf40: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
bf50: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
bf60: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
bf70: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
bf80: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
bf90: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
bfa0: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
bfb0: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
bfc0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
bfd0: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69  s routine has ei
bfe0: 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72 61  ther 3 or 6 para
bff0: 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67  meters depending
c000: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
c010: 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ot.** the SQLITE
c020: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c030: 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d  ETADATA compile-
c040: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75  time option is u
c050: 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
c060: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c070: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64  UMN_METADATA.# d
c080: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
c090: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
c0a0: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
c0b0: 2c 43 2c 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20  ,C,D,E,F).#else 
c0c0: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
c0d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c0e0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
c0f0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
c100: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
c110: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
c120: 28 41 2c 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73  (A,B,F).#endif.s
c130: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c140: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
c150: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
c160: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
c170: 45 78 70 72 2c 0a 23 69 66 64 65 66 20 53 51 4c  Expr,.#ifdef SQL
c180: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
c190: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 6f 6e  N_METADATA.  con
c1a0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
c1b0: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
c1c0: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
c1d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
c1e0: 72 69 67 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20  rigCol,.#endif. 
c1f0: 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29   u8 *pEstWidth.)
c200: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
c210: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
c220: 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74   j;.  u8 estWidt
c230: 68 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  h = 1;.#ifdef SQ
c240: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c250: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68  MN_METADATA.  ch
c260: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
c270: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
c280: 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  nst *zOrigTab = 
c290: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
c2a0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
c2b0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
c2c0: 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61   pExpr!=0 );.  a
c2d0: 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
c2e0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 77 69  List!=0 );.  swi
c2f0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
c300: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
c310: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
c320: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
c330: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c340: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
c350: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
c360: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
c370: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
c380: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
c390: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
c3a0: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
c3b0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
c3c0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
c3d0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
c3e0: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
c3f0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
c400: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
c410: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
c420: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
c430: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c440: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
c450: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
c460: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
c470: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
c480: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
c490: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
c4a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
c4b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
c4c0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
c4d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c4e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
c4f0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
c500: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
c510: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
c520: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
c530: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
c540: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
c550: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
c560: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
c570: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
c580: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
c590: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
c5a0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
c5b0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
c5c0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
c5d0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
c5e0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
c5f0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
c600: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
c610: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
c620: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
c630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c640: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
c650: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
c660: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
c670: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
c680: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
c690: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
c6a0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
c6b0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
c6c0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
c6d0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
c6e0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
c6f0: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
c700: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
c710: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
c720: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
c730: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
c740: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
c750: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
c760: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
c770: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
c780: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
c790: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
c7a0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
c7b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
c7c0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c7d0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
c7e0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
c7f0: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
c800: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
c810: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
c820: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
c830: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
c840: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
c850: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
c860: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
c870: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
c880: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
c890: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
c8a0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
c8b0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
c8c0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
c8d0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
c8e0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
c8f0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
c900: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
c910: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
c920: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
c930: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
c940: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
c950: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
c960: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
c970: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
c980: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
c990: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
c9a0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
c9b0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
c9c0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
c9d0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
c9e0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
c9f0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
ca00: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ca10: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
ca20: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
ca30: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
ca40: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
ca50: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
ca60: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
ca70: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
ca80: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
ca90: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
caa0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
cab0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
cac0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
cad0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
cae0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
caf0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
cb00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
cb10: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
cb20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
cb30: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57  ( iCol>=0 && ALW
cb40: 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c  AYS(iCol<pS->pEL
cb50: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
cb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
cb70: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
cb80: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
cb90: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
cba0: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
cbb0: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
cbc0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
cbd0: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
cbe0: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
cbf0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
cc00: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
cc10: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
cc20: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
cc30: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
cc40: 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
cc50: 54 68 65 20 41 4c 57 41 59 53 28 29 20 69 73 20  The ALWAYS() is 
cc60: 62 65 63 61 75 73 65 20 69 43 6f 6c 3e 3d 70 53  because iCol>=pS
cc70: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
cc80: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 20  will have been. 
cc90: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 67           ** caug
cca0: 68 74 20 61 6c 72 65 61 64 79 20 62 79 20 6e 61  ht already by na
ccb0: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20  me resolution.. 
ccc0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
ccd0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
cce0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
ccf0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
cd00: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
cd10: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
cd20: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
cd30: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
cd40: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
cd50: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  NC;.          sN
cd60: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
cd70: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
cd80: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
cd90: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f  Type(&sNC, p,&zO
cda0: 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c  rigDb,&zOrigTab,
cdb0: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
cdc0: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20  idth); .        
cdd0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
cde0: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
cdf0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
ce00: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
ce10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
ce20: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
ce30: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
ce40: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
ce50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
ce60: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
ce70: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
ce80: 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66  >nCol) );.#ifdef
ce90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
cea0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
ceb0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
cec0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
ced0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
cee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
cef0: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
cf00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cf10: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
cf20: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
cf30: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
cf40: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
cf50: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
cf60: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
cf70: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ],0);.          
cf80: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
cf90: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
cfa0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
cfb0: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
cfc0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
cfd0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
cfe0: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
cff0: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
d000: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
d010: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
d020: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
d030: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
d040: 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  gDb = pNC->pPars
d050: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
d060: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zDbSName;.      
d070: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
d080: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
d090: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
d0a0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
d0b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d0c0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
d0d0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
d0e0: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
d0f0: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ],0);.          
d100: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
d110: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
d120: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
d130: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
d140: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
d150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d160: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
d170: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
d180: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
d190: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
d1a0: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
d1b0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
d1c0: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
d1d0: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
d1e0: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
d1f0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
d200: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
d210: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
d220: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
d230: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
d240: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
d250: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
d260: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
d270: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
d280: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
d290: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
d2a0: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
d2b0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
d2c0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
d2d0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
d2e0: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
d2f0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
d300: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
d310: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
d320: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
d330: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
d340: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
d350: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
d360: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
d370: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
d380: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
d390: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d3a0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
d3b0: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
d3c0: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
d3d0: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
d3e0: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
d3f0: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
d400: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
d410: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
d420: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
d430: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
d440: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
d450: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
d460: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
d470: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
d480: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
d490: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
d4a0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
d4b0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
d4c0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
d4d0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
d4e0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
d4f0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
d500: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
d510: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d520: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
d530: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
d540: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
d550: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
d560: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d570: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
d580: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
d590: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d5a0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
d5b0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
d5c0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
d5d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d5e0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
d5f0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
d600: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
d610: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
d620: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
d630: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
d640: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
d650: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d660: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
d670: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
d680: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d690: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
d6a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
d6b0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
d6c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
d6d0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
d6e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
d6f0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
d700: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
d710: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
d720: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
d730: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
d740: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
d750: 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  gCol, 0);..    /
d760: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
d770: 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70  make its own cop
d780: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
d790: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
d7a0: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
d7b0: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
d7c0: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
d7d0: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
d7e0: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
d7f0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
d800: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
d810: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
d820: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d830: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
d840: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c  SE, zOrigDb, SQL
d850: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d870: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d880: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
d890: 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f  OrigTab, SQLITE_
d8a0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d8b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d8c0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d8d0: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
d8e0: 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  gCol, SQLITE_TRA
d8f0: 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20  NSIENT);.#else. 
d900: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d910: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
d920: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
d930: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
d940: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d950: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
d960: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
d970: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d980: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
d990: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d9a0: 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d  T_DECLTYPE) */.}
d9b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d9c0: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 63 74  he Table objecct
d9d0: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
d9e0: 74 68 61 74 20 68 61 73 20 63 75 72 73 6f 72 20  that has cursor 
d9f0: 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 4f 72 20 72  iCursor..** Or r
da00: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
da10: 20 73 75 63 68 20 54 61 62 6c 65 20 6f 62 6a 65   such Table obje
da20: 63 74 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ct exists in the
da30: 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 73 74 61   SrcList..*/.sta
da40: 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62 6c 65  tic Table *table
da50: 57 69 74 68 43 75 72 73 6f 72 28 53 72 63 4c 69  WithCursor(SrcLi
da60: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69  st *pList, int i
da70: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 6a  Cursor){.  int j
da80: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  ;.  for(j=0; j<p
da90: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 29  List->nSrc; j++)
daa0: 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  {.    if( pList-
dab0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 69  >a[j].iCursor==i
dac0: 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
dad0: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  pList->a[j].pTab
dae0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
daf0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
db00: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
db10: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
db20: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
db30: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
db40: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
db50: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
db60: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
db70: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
db80: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
db90: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
dba0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
dbb0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
dbc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dbd0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
dbe0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
dbf0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
dc00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
dc10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
dc20: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
dc30: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
dc40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
dc50: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
dc60: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
dc70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c  .  int i;.  Tabl
dc80: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
dc90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
dca0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
dcb0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
dcc0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
dcd0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
dce0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
dcf0: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
dd00: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
dd10: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
dd20: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
dd30: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
dd40: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
dd50: 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e 6d  amesSet || db->m
dd60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
dd70: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
dd80: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
dd90: 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b  ( pTabList!=0 );
dda0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
ddb0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
ddc0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
ddd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
dde0: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
ddf0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
de00: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
de10: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
de20: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
de30: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
de40: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
de50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
de60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
de70: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
de80: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
de90: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
dea0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
deb0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
dec0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
ded0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
dee0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
def0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
df00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
df10: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
df20: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
df30: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
df40: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
df50: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
df60: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
df70: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
df80: 55 4d 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20  UMN).           
df90: 26 26 20 28 70 54 61 62 20 3d 20 74 61 62 6c 65  && (pTab = table
dfa0: 57 69 74 68 43 75 72 73 6f 72 28 70 54 61 62 4c  WithCursor(pTabL
dfb0: 69 73 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 29  ist, p->iTable))
dfc0: 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
dfd0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
dfe0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
dff0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
e000: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
e010: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
e020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
e030: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
e040: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
e050: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
e060: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
e070: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
e080: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
e090: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
e0a0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
e0b0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
e0c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
e0d0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
e0e0: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
e0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e100: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
e110: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
e120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e130: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c  DbStrDup(db, pEL
e140: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
e150: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e160: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e170: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  f( fullNames ){.
e180: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e190: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
e1a0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e1b0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
e1c0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
e1d0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
e1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
e1f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
e200: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
e210: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e220: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e240: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
e250: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
e260: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
e270: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
e280: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
e290: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e2a0: 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
e2b0: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
e2c0: 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
e2d0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
e2e0: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
e2f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e300: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
e310: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
e320: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
e330: 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
e340: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
e350: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
e360: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
e370: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
e380: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
e390: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
e3a0: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
e3b0: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
e3c0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
e3d0: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
e3e0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
e3f0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
e400: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
e410: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
e420: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
e430: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
e440: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
e450: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
e460: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
e470: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
e480: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
e490: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
e4a0: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
e4b0: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
e4c0: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
e4d0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
e4e0: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
e4f0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
e500: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
e510: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
e520: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
e530: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
e540: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
e550: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
e560: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
e570: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e  ITE_NOMEM..*/.in
e580: 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73  t sqlite3Columns
e590: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
e5a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e5b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e5c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e5d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e5e0: 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20  ,       /* Expr 
e5f0: 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20  list from which 
e600: 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e  to derive column
e610: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20   names */.  i16 
e620: 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *pnCol,         
e630: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e640: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
e650: 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c  ns here */.  Col
e660: 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20  umn **paCol     
e670: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
e680: 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73  e new column lis
e690: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  t here */.){.  s
e6a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e6b0: 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61  rse->db;   /* Da
e6c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e6d0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  n */.  int i, j;
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e700: 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74  ers */.  u32 cnt
e710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e720: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64       /* Index ad
e730: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
e740: 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  name unique */. 
e750: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a   Column *aCol, *
e760: 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  pCol;        /* 
e770: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
e780: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
e790: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
e7c0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
e7d0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
e7e0: 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
e7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
e800: 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e  ession for a sin
e810: 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  gle result colum
e820: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  n */.  char *zNa
e830: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
e840: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
e850: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
e860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e870: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61     /* Size of na
e880: 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f  me in zName[] */
e890: 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20  .  Hash ht;     
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e8b0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20  * Hash table of 
e8c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
e8d0: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
e8e0: 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70  it(&ht);.  if( p
e8f0: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
e900: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
e910: 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
e920: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
e930: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
e940: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
e950: 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
e960: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
e970: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
e980: 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
e990: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28   assert( nCol==(
e9a0: 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70  i16)nCol );.  *p
e9b0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
e9c0: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
e9d0: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
e9e0: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21  Col; i<nCol && !
e9f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ea00: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
ea10: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
ea20: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
ea30: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
ea40: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c    */.    p = sql
ea50: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
ea60: 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ate(pEList->a[i]
ea70: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
ea80: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
ea90: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
eaa0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
eab0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
eac0: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
ead0: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
eae0: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
eaf0: 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e */.    }else{.
eb00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
eb10: 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68  Expr = p;  /* Th
eb20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
eb30: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
eb40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
eb50: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
eb60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
eb70: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
eb80: 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69  th this expressi
eb90: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  on */.      whil
eba0: 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  e( pColExpr->op=
ebb0: 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
ebc0: 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43     pColExpr = pC
ebd0: 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  olExpr->pRight;.
ebe0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ebf0: 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20  pColExpr!=0 );. 
ec00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ec10: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
ec20: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 43 6f 6c  K_COLUMN && pCol
ec30: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 29 7b  Expr->pTab!=0 ){
ec40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
ec50: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
ec60: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
ec70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
ec80: 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
ec90: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
eca0: 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70    pTab = pColExp
ecb0: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
ecc0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
ecd0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
ece0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
ecf0: 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62  = iCol>=0 ? pTab
ed00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
ed10: 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20  me : "rowid";.  
ed20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
ed30: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  olExpr->op==TK_I
ed40: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  D ){.        ass
ed50: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
ed60: 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20  perty(pColExpr, 
ed70: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
ed80: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ed90: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
eda0: 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  en;.      }else{
edb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
edc0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
edd0: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
ede0: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
edf0: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
ee00: 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74    zName = pEList
ee10: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20  ->a[i].zSpan;.  
ee20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ee30: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
ee40: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
ee50: 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a   zName);..    /*
ee60: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
ee70: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
ee80: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
ee90: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
eea0: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
eeb0: 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68  an integer to th
eec0: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
eed0: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
eee0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74  ..    */.    cnt
eef0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
ef00: 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65   zName && sqlite
ef10: 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a  3HashFind(&ht, z
ef20: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
ef30: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
ef40: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
ef50: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d  ;.      if( nNam
ef60: 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  e>0 ){.        f
ef70: 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e  or(j=nName-1; j>
ef80: 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  0 && sqlite3Isdi
ef90: 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a  git(zName[j]); j
efa0: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
efb0: 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20  ( zName[j]==':' 
efc0: 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20  ) nName = j;.   
efd0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65     }.      zName
efe0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
eff0: 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c  f(db, "%.*z:%u",
f000: 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b   nName, zName, +
f010: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  +cnt);.      if(
f020: 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33   cnt>3 ) sqlite3
f030: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
f040: 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a  of(cnt), &cnt);.
f050: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
f060: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
f070: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
f080: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
f090: 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20  me(0, pCol);.   
f0a0: 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71   if( zName && sq
f0b0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
f0c0: 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c  &ht, zName, pCol
f0d0: 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20  )==pCol ){.     
f0e0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
f0f0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
f100: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
f110: 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64  ar(&ht);.  if( d
f120: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f130: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
f140: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
f150: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f160: 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b, aCol[j].zName
f170: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f180: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
f190: 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c  Col);.    *paCol
f1a0: 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c   = 0;.    *pnCol
f1b0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
f1c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
f1d0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
f1e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f1f0: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
f200: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
f210: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
f220: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
f230: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
f240: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
f250: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
f260: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
f270: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
f280: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
f290: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
f2a0: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
f2b0: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
f2c0: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
f2d0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
f2e0: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
f2f0: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
f300: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
f310: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
f320: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
f330: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
f340: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
f350: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
f360: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76  e resolved..*/.v
f370: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
f380: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
f390: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
f3a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f3b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
f3c0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62  ontexts */.  Tab
f3d0: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
f3e0: 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e     /* Add column
f3f0: 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f   type informatio
f400: 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  n to this table 
f410: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
f420: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
f430: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
f440: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
f450: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
f460: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
f470: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
f480: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
f490: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
f4a0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
f4b0: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
f4c0: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
f4d0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
f4e0: 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20  ;.  u64 szAll = 
f4f0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
f500: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73  elect!=0 );.  as
f510: 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e  sert( (pSelect->
f520: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
f530: 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20  solved)!=0 );.  
f540: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
f550: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
f560: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
f570: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f580: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
f590: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
f5a0: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
f5b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
f5c0: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
f5d0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
f5e0: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
f5f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
f600: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(i=0, pCol=pTa
f610: 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  b->aCol; i<pTab-
f620: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
f630: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
f640: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20  har *zType;.    
f650: 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20  int n, m;.    p 
f660: 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[i].pExpr;.  
f670: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
f680: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
f690: 20 30 2c 20 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a   0, 0, &pCol->sz
f6a0: 45 73 74 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20  Est);.    szAll 
f6b0: 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  += pCol->szEst;.
f6c0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
f6d0: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
f6e0: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
f6f0: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 28 6d   if( zType && (m
f700: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f710: 33 30 28 7a 54 79 70 65 29 29 3e 30 20 29 7b 0a  30(zType))>0 ){.
f720: 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
f730: 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e  3Strlen30(pCol->
f740: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43  zName);.      pC
f750: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ol->zName = sqli
f760: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
f770: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
f780: 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20  me, n+m+2);.    
f790: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d    if( pCol->zNam
f7a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e ){.        mem
f7b0: 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  cpy(&pCol->zName
f7c0: 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b  [n+1], zType, m+
f7d0: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  1);.        pCol
f7e0: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
f7f0: 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20  LFLAG_HASTYPE;. 
f800: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f810: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
f820: 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
f830: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
f840: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70  _AFF_BLOB;.    p
f850: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
f860: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
f870: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
f880: 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f  oll && pCol->zCo
f890: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ll==0 ){.      p
f8a0: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
f8b0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
f8c0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
f8d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
f8e0: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
f8f0: 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c  ite3LogEst(szAll
f900: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  *4);.}../*.** Gi
f910: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
f920: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
f930: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
f940: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
f950: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
f960: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
f970: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
f980: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
f990: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
f9a0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
f9b0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
f9c0: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
f9d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
f9e0: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
f9f0: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
fa00: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
fa10: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
fa20: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
fa30: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
fa40: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
fa50: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
fa60: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
fa70: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
fa80: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
fa90: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
faa0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
fab0: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
fac0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
fad0: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
fae0: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
faf0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
fb00: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
fb10: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
fb20: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
fb30: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
fb40: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
fb50: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
fb60: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
fb70: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
fb80: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
fb90: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
fba0: 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
fbb0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
fbc0: 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61  Disable );.  pTa
fbd0: 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
fbe0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
fbf0: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
fc00: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
fc10: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
fc20: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
fc30: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   );.  sqlite3Col
fc40: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
fc50: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
fc60: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
fc70: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
fc80: 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ol);.  sqlite3Se
fc90: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
fca0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
fcb0: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
fcc0: 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
fcd0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
fce0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fcf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
fd00: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
fd10: 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
fd20: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
fd30: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
fd40: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
fd50: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
fd60: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
fd70: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
fd80: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
fd90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
fda0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
fdb0: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
fdc0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74  in pParse..*/.st
fdd0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
fde0: 4c 49 4e 45 20 56 64 62 65 20 2a 61 6c 6c 6f 63  LINE Vdbe *alloc
fdf0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
fe00: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
fe10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
fe20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
fe30: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  te(pParse);.  if
fe40: 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62  ( v ) sqlite3Vdb
fe50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
fe60: 69 74 2c 20 30 2c 20 31 29 3b 0a 20 20 69 66 28  it, 0, 1);.  if(
fe70: 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
fe80: 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  el==0.   && Opti
fe90: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
fea0: 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
feb0: 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
fec0: 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ).  ){.    pPars
fed0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
fee0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
fef0: 72 6e 20 76 3b 0a 7d 0a 56 64 62 65 20 2a 73 71  rn v;.}.Vdbe *sq
ff00: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
ff10: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
ff20: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
ff30: 3e 70 56 64 62 65 3b 0a 20 20 72 65 74 75 72 6e  >pVdbe;.  return
ff40: 20 76 20 3f 20 76 20 3a 20 61 6c 6c 6f 63 56 64   v ? v : allocVd
ff50: 62 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a  be(pParse);.}...
ff60: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
ff70: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
ff80: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
ff90: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
ffa0: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
ffb0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
ffc0: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
ffd0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
ffe0: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
fff0: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
10000 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
10010 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
10020 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
10030 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
10040 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
10050 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
10060 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
10070 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
10080 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
10090 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
100a0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
100b0 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
100c0 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
100d0 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
100e0 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
100f0 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
10100 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
10110 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
10120 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
10130 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
10140 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
10150 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
10160 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
10170 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
10180 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
10190 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
101a0 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
101b0 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
101c0 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
101d0 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
101e0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
101f0 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
10200 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
10210 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
10220 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
10230 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
10240 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
10250 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
10260 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
10270 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
10280 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
10290 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
102a0 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
102b0 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
102c0 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
102d0 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
102e0 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
102f0 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
10300 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
10310 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
10320 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
10330 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
10340 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
10350 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
10360 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
10370 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
10380 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
10390 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
103a0 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
103b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
103c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
103d0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
103e0 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
103f0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
10400 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
10410 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
10420 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
10430 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
10440 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  t n;.  if( p->iL
10450 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
10460 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
10470 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
10480 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
10490 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
104a0 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
104b0 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
104c0 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
104d0 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
104e0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
104f0 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
10500 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
10510 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
10520 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
10530 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
10540 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
10550 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
10560 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30   || p->pLimit!=0
10570 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   );.  if( p->pLi
10580 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
10590 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
105a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
105b0 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
105c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
105d0 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30      assert( v!=0
105e0 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
105f0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
10600 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20  (p->pLimit, &n) 
10610 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10630 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
10640 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
10650 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
10660 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
10670 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
10680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10690 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65  VdbeGoto(v, iBre
106a0 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
106b0 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
106c0 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74  nSelectRow>sqlit
106d0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
106e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
106f0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
10700 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
10710 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  );.        p->se
10720 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78  lFlags |= SF_Fix
10730 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d  edLimit;.      }
10740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10750 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10760 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
10770 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
10780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10790 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
107a0 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20  BeInt, iLimit); 
107b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
107c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
107d0 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
107e0 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
107f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10800 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
10810 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
10820 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10840 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
10850 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
10860 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
10870 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
10880 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
10890 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
108a0 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
108b0 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
108c0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
108d0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
108e0 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
108f0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
10900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10910 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
10920 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43   iOffset); VdbeC
10930 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
10940 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10950 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
10960 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
10970 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10980 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
10990 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
109a0 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  +1, iOffset);.  
109b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
109c0 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
109d0 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T"));.    }.  }.
109e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
109f0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
10a00 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
10a10 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
10a20 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
10a30 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
10a40 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
10a50 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
10a60 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
10a70 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
10a80 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
10a90 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
10aa0 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
10ab0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
10ac0 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
10ad0 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
10ae0 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
10af0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
10b00 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
10b10 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
10b20 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
10b30 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
10b40 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
10b50 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
10b60 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
10b70 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10b80 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
10b90 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
10ba0 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
10bb0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
10bc0 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
10bd0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
10be0 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
10bf0 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
10c00 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
10c10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
10c20 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f  l>=0 );.  /* iCo
10c30 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74  l must be less t
10c40 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  han p->pEList->n
10c50 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65  Expr.  Otherwise
10c60 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a   an error would.
10c70 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74    ** have been t
10c80 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d  hrown during nam
10c90 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64  e resolution and
10ca0 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61   we would not ha
10cb0 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74  ve gotten.  ** t
10cc0 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28  his far */.  if(
10cd0 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41   pRet==0 && ALWA
10ce0 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  YS(iCol<p->pELis
10cf0 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
10d00 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
10d10 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
10d20 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
10d30 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
10d40 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
10d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
10d60 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
10d70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
10d80 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
10d90 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
10da0 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
10db0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
10dc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
10dd0 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
10de0 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
10df0 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
10e00 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
10e10 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
10e20 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
10e30 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
10e40 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
10e50 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
10e60 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
10e70 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
10e80 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
10e90 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
10ea0 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
10eb0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
10ec0 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
10ed0 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
10ee0 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
10ef0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
10f00 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
10f10 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
10f20 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
10f30 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
10f40 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
10f50 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
10f60 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10f70 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10f80 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
10f90 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
10fa0 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
10fb0 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
10fc0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
10fd0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
10fe0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
10ff0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
11000 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11010 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
11020 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
11030 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
11040 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
11050 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
11060 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
11070 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
11080 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
11090 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
110a0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
110b0 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
110c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
110d0 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
110e0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
110f0 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
11100 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
11110 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
11120 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
11130 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
11140 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
11150 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
11160 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11170 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
11180 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
11190 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
111a0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
111b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
111c0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
111d0 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
111e0 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
111f0 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
11200 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
11210 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
11220 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
11230 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
11240 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
11250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11260 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
11270 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
11280 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
11290 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
112a0 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
112b0 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
112c0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
112d0 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
112e0 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
112f0 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
11300 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
11310 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
11340 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
11350 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
11360 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
11380 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
11390 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
113a0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
113b0 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
113c0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
113d0 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
113e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
113f0 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
11400 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
11410 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
11420 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  a[].fg.isRecursi
11430 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54  ve flag..**.** T
11440 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72  he setup-query r
11450 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65  uns once to gene
11460 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20  rate an initial 
11470 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  set of rows that
11480 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75   go.** into a Qu
11490 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73  eue table.  Rows
114a0 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
114b0 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61  rom the Queue ta
114c0 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e  ble one by.** on
114d0 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74  e.  Each row ext
114e0 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
114f0 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70  e is output to p
11500 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Dest.  Then the 
11510 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63  single.** extrac
11520 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20  ted row (now in 
11530 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62  the iCurrent tab
11540 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  le) becomes the 
11550 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a  content of the.*
11560 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  * recursive-tabl
11570 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76  e for a recursiv
11580 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68  e-query run.  Th
11590 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
115a0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a  recursive-query.
115b0 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b  ** is added back
115c0 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
115d0 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f  table.  Then ano
115e0 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72  ther row is extr
115f0 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
11600 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72  .** and the iter
11610 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20  ation continues 
11620 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
11630 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
11640 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
11650 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72  pound query oper
11660 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68  ator is UNION th
11670 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20  en no duplicate 
11680 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a  rows are ever.**
11690 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
116a0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
116b0 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74   The iDistinct t
116c0 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70  able keeps a cop
116d0 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a  y of all rows.**
116e0 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20   that have ever 
116f0 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
11700 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75  to Queue and cau
11710 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74  ses duplicates t
11720 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65  o be.** discarde
11730 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61  d.  If the opera
11740 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c  tor is UNION ALL
11750 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65  , then duplicate
11760 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  s are allowed..*
11770 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  * .** If the que
11780 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20  ry has an ORDER 
11790 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73  BY, then entries
117a0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61   in the Queue ta
117b0 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a  ble are kept in.
117c0 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  ** ORDER BY orde
117d0 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  r and the first 
117e0 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74  entry is extract
117f0 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c  ed for each cycl
11800 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61  e.  Without.** a
11810 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
11820 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a  Queue table is j
11830 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a  ust a FIFO..**.*
11840 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61  * If a LIMIT cla
11850 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c  use is provided,
11860 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
11870 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20  ion stops after 
11880 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61  LIMIT rows.** ha
11890 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74  ve been output t
118a0 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49  o pDest.  A LIMI
118b0 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20  T of zero means 
118c0 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77  to output no row
118d0 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74  s and a.** negat
118e0 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20  ive LIMIT means 
118f0 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f  to output all ro
11900 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ws.  If there is
11910 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20   also an OFFSET 
11920 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61  clause.** with a
11930 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
11940 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
11950 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61  OFFSET outputs a
11960 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74  re discarded rat
11970 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e  her.** than bein
11980 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e  g sent to pDest.
11990 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e    The LIMIT coun
119a0 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
119b0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46   until after OFF
119c0 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65  SET.** rows have
119d0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a   been skipped..*
119e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
119f0 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
11a00 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73  iveQuery(.  Pars
11a10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11a20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11a30 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
11a40 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11a50 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65  /* The recursive
11a60 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f   SELECT to be co
11a70 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
11a80 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
11a90 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
11aa0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
11ab0 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
11ac0 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
11ad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
11ae0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
11af0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
11b00 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  */.  int nCol = 
11b10 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11b20 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
11b30 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
11b40 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a  ecursive table *
11b50 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
11b60 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
11b70 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
11b80 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
11b90 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
11ba0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74  /.  Select *pSet
11bb0 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20  up = p->pPrior; 
11bc0 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71    /* The setup q
11bd0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64  uery */.  int ad
11be0 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
11bf0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
11c00 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
11c10 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  int addrCont, ad
11c20 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a  drBreak;      /*
11c30 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52   CONTINUE and BR
11c40 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f  EAK addresses */
11c50 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
11c60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
11c70 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20   /* The Current 
11c80 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
11c90 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20  egCurrent;      
11ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11cb0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72  ster holding Cur
11cc0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
11cd0 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20  int iQueue;     
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cf0 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   The Queue table
11d00 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69   */.  int iDisti
11d10 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nct = 0;        
11d20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
11d30 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20   unique results 
11d40 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e  if UNION */.  in
11d50 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69  t eDest = SRT_Fi
11d60 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  fo;         /* H
11d70 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51  ow to write to Q
11d80 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ueue */.  Select
11d90 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20  Dest destQueue; 
11da0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
11db0 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67  tDest targetting
11dc0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11dd0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11e00 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11e30 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c   code */.  ExprL
11e40 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
11e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11e60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11e70 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
11e80 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20  t, *pOffset;    
11e90 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49     /* Saved LIMI
11ea0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
11eb0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20    int regLimit, 
11ec0 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20  regOffset;      
11ed0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65  /* Registers use
11ee0 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f  d by LIMIT and O
11ef0 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  FFSET */..  /* O
11f00 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74  btain authorizat
11f10 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75  ion to do a recu
11f20 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
11f30 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11f40 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
11f50 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20  LITE_RECURSIVE, 
11f60 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
11f70 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73  n;..  /* Process
11f80 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
11f90 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69  FFSET clauses, i
11fa0 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a  f they exist */.
11fb0 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71    addrBreak = sq
11fc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11fd0 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
11fe0 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
11ff0 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
12000 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
12010 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
12020 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
12030 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
12040 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73  >pLimit;.  pOffs
12050 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
12060 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
12070 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
12080 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
12090 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
120a0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
120b0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
120c0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
120d0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
120e0 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
120f0 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
12100 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
12110 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
12120 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
12130 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
12140 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
12150 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52  Src->a[i].fg.isR
12160 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
12170 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
12180 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
12190 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
121a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
121b0 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
121c0 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
121d0 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
121e0 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
121f0 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
12200 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
12210 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
12220 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
12230 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
12240 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
12250 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
12260 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
12270 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
12280 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
12290 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
122a0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
122b0 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
122c0 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
122d0 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
122e0 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
122f0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
12300 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
12310 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
12320 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
12330 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
12340 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
12350 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
12360 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
12370 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
12380 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
12390 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
123a0 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
123b0 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
123c0 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
123d0 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
123e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
123f0 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
12400 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
12410 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
12420 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
12430 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
12440 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
12450 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
12460 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
12470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12480 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
12490 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
124a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
124b0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
124c0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
124d0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
124e0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
124f0 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
12500 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
12510 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
12520 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12530 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
12540 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
12550 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
12560 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
12570 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
12580 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
12590 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
125a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
125b0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
125c0 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
125d0 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
125e0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
125f0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
12600 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
12610 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12620 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
12630 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
12640 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
12650 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
12660 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
12670 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
12680 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
12690 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72  ->pNext = 0;.  r
126a0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
126b0 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70  t(pParse, pSetup
126c0 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20  , &destQueue);. 
126d0 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
126e0 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   p;.  if( rc ) g
126f0 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72  oto end_of_recur
12700 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f  sive_query;..  /
12710 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
12720 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65  row in the Queue
12730 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74   and output that
12740 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f   row */.  addrTo
12750 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
12760 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
12770 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72  nd, iQueue, addr
12780 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
12790 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  rage(v);..  /* T
127a0 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74  ransfer the next
127b0 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76   row in Queue ov
127c0 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f  er to Current */
127d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
127e0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
127f0 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f  ow, iCurrent); /
12800 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d  * To reset colum
12810 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28  n cache */.  if(
12820 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
12830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12840 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
12850 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
12860 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43  y->nExpr+1, regC
12870 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  urrent);.  }else
12880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12890 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
128a0 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72  wData, iQueue, r
128b0 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a  egCurrent);.  }.
128c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
128d0 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
128e0 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
128f0 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67   Output the sing
12900 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
12910 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20  t */.  addrCont 
12920 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12930 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64  eLabel(v);.  cod
12940 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66  eOffset(v, regOf
12950 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b  fset, addrCont);
12960 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
12970 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
12980 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e  >pEList, iCurren
12990 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70  t,.      0, 0, p
129a0 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Dest, addrCont, 
129b0 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
129c0 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20  ( regLimit ){.  
129d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
129e0 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
129f0 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74  mpZero, regLimit
12a00 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
12a10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
12a20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12a30 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12a40 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a  (v, addrCont);..
12a50 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65    /* Execute the
12a60 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
12a70 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e  T taking the sin
12a80 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
12a90 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76  nt as.  ** the v
12aa0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63  alue for the rec
12ab0 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74  ursive-table. St
12ac0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
12ad0 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20  in the Queue..  
12ae0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
12af0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
12b00 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ate ){.    sqlit
12b10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12b20 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67  e, "recursive ag
12b30 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
12b40 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b  not supported");
12b50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
12b60 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
12b70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
12b80 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
12b90 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
12ba0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
12bb0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
12bc0 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
12bd0 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
12be0 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
12bf0 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
12c00 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
12c10 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
12c20 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
12c30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
12c40 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
12c50 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
12c60 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
12c70 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
12c80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
12c90 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
12ca0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
12cb0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
12cc0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70  = pLimit;.  p->p
12cd0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
12ce0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
12cf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12d00 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46  MIT_CTE */../* F
12d10 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
12d20 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
12d30 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
12d40 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
12d50 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12d60 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12d70 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12d90 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
12da0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
12db0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
12dc0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12dd0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12de0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12df0 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  /.);../*.** Hand
12e00 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  le the special c
12e10 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ase of a compoun
12e20 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
12e30 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a  iginates from a.
12e40 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ** VALUES clause
12e50 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74  .  By handling t
12e60 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
12e70 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20   case, we avoid 
12e80 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f  deep.** recursio
12e90 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e  n, and thus do n
12ea0 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72  ot need to enfor
12eb0 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  ce the SQLITE_LI
12ec0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
12ed0 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55  ECT.** on a VALU
12ee0 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ES clause..**.**
12ef0 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c   Because the Sel
12f00 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69  ect object origi
12f10 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c  nates from a VAL
12f20 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20  UES clause:.**  
12f30 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c   (1) It has no L
12f40 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a  IMIT or OFFSET.*
12f50 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
12f60 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
12f70 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
12f80 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
12f90 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ause.*/.static i
12fa0 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61  nt multiSelectVa
12fb0 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lues(.  Parse *p
12fc0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
12fd0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12fe0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13000 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
13010 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
13020 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
13030 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
13040 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
13050 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
13060 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
13070 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e  *pPrior;.  int n
13080 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
13090 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
130a0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
130b0 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a  F_MultiValue );.
130c0 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
130d0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
130e0 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20  SF_Values );.   
130f0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
13100 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70  TK_ALL || (p->op
13110 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70  ==TK_SELECT && p
13120 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a  ->pPrior==0) );.
13130 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13140 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Limit==0 );.    
13150 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
13160 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  et==0 );.    ass
13170 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
13180 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
13190 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e  Expr==p->pNext->
131a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
131b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69  .    if( p->pPri
131c0 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or==0 ) break;. 
131d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50     assert( p->pP
131e0 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29  rior->pNext==p )
131f0 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  ;.    p = p->pPr
13200 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b  ior;.    nRow++;
13210 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20  .  }while(1);.  
13220 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
13230 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
13240 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  or;.    p->pPrio
13250 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
13260 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13270 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
13280 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
13290 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28   pPrior;.    if(
132a0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
132b0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
132c0 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70   nRow;.    p = p
132d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  ->pNext;.  }.  r
132e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
132f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13300 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
13310 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
13320 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
13330 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
13340 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
13350 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
13360 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
13370 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
13380 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
13390 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
133a0 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
133b0 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
133c0 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
133d0 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
133e0 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
133f0 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
13400 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
13410 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
13420 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13430 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
13440 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
13450 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
13460 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
13470 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
13480 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
13490 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
134a0 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
134b0 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
134c0 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
134d0 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
134e0 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
134f0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
13500 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
13510 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
13520 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
13530 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
13540 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
13550 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
13560 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
13570 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
13580 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
13590 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
135a0 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
135b0 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
135c0 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
135e0 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
135f0 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
13600 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
13610 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
13620 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
13630 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
13640 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
13650 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
13660 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
13670 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
13680 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
13690 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
136a0 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
136b0 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
136c0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
136d0 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
136e0 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
136f0 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
13700 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
13710 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
13720 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
13730 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
13740 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
13750 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
13760 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
13770 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
13780 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13790 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
137a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
137b0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
137c0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
137d0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
137e0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
137f0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
13800 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
13810 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
13820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13830 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
13840 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
13850 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
13860 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
13870 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
13880 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
13890 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
138a0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
138b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
138c0 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
138d0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
138e0 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
138f0 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
13900 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
13910 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
13920 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
13930 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
13940 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
13950 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
13960 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
13970 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
13980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13990 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
139a0 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20  t iSub1 = 0;    
139b0 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
139c0 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
139d0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20   */.  int iSub2 
139e0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
139f0 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
13a00 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
13a10 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
13a20 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
13a30 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
13a40 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
13a50 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
13a60 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
13a70 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
13a80 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
13a90 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
13aa0 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
13ab0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
13ac0 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b   && p->pPrior );
13ad0 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e    /* Calling fun
13ae0 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73  ction guarantees
13af0 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20   this much */.  
13b00 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
13b10 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
13b20 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70  ive)==0 || p->op
13b30 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f  ==TK_ALL || p->o
13b40 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
13b50 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
13b60 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
13b70 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d  pPrior;.  dest =
13b80 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
13b90 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
13ba0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13bb0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
13bc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
13bd0 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
13be0 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
13bf0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
13c00 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
13c10 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
13c20 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13c30 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
13c40 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
13c50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13c60 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
13c70 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
13c80 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
13c90 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
13ca0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
13cb0 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
13cc0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
13cd0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
13ce0 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
13cf0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13d00 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
13d10 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
13d20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
13d30 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
13d40 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
13d50 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
13d60 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
13d70 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
13d80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
13d90 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
13da0 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
13db0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
13dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13dd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
13de0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
13df0 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
13e00 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
13e10 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
13e20 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
13e30 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c  /* Special handl
13e40 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ing for a compou
13e50 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f  nd-select that o
13e60 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56  riginates as a V
13e70 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20  ALUES clause..  
13e80 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
13e90 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
13ea0 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  alue ){.    rc =
13eb0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
13ec0 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  es(pParse, p, &d
13ed0 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d  est);.    goto m
13ee0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13f00 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
13f10 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
13f20 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
13f30 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
13f40 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
13f50 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
13f60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
13f70 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
13f80 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73  ->pEList );.  as
13f90 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
13fa0 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e  >nExpr==pPrior->
13fb0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
13fc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13fd0 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
13fe0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13ff0 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
14000 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65    generateWithRe
14010 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61  cursiveQuery(pPa
14020 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
14030 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
14040 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
14050 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
14060 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
14070 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
14080 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
14090 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
140a0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
140b0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
140c0 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
140d0 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
140e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
140f0 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
14100 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
14110 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
14120 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
14130 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
14140 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ALL: {.      int
14150 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
14160 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20   int nLimit;.   
14170 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
14180 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
14190 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
141a0 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
141b0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
141c0 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
141d0 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  et;.      pPrior
141e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
141f0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
14200 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
14210 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
14220 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14230 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14240 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14250 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14260 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14270 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
14280 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14290 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
142a0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
142b0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
142c0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
142d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
142e0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
142f0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
14300 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
14310 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
14320 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
14330 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
14340 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
14350 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
14360 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14370 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
14380 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
14390 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
143a0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
143b0 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
143c0 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
143d0 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
143e0 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
143f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
14400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14410 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69  v, OP_OffsetLimi
14420 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14440 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
14450 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73  fset+1, p->iOffs
14460 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
14470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
14480 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14490 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
144a0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
144b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
144c0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
144d0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
144e0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
144f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
14500 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
14510 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14520 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
14530 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
14540 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
14550 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
14560 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
14570 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
14580 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
14590 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
145a0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
145b0 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
145c0 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
145d0 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
145e0 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
145f0 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  > sqlite3LogEst(
14600 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20  (u64)nLimit) .  
14610 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
14620 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
14630 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
14640 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
14650 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
14660 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
14670 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14680 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
14690 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
146a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
146b0 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
146c0 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
146d0 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
146e0 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
146f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
14700 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
14710 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
14720 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
14730 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
14740 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
14750 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
14760 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
14770 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
14780 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
14790 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
147a0 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
147b0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
147c0 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
147d0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
147e0 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
147f0 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
14800 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
14810 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
14820 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
14830 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
14840 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
14850 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14860 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
14870 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
14880 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
14890 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
148a0 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
148b0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
148c0 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
148d0 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
148e0 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
148f0 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
14900 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
14910 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14920 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
14930 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
14940 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
14950 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
14960 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14970 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
14980 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
14990 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
149a0 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
149b0 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
149c0 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
149d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
149e0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
149f0 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
14a00 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
14a10 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
14a20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
14a30 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
14a40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
14a50 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
14a60 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14a70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14a80 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
14a90 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
14aa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ab0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14ac0 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
14ad0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
14ae0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
14af0 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
14b00 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
14b10 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
14b20 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64  dr;.        find
14b30 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
14b40 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
14b50 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
14b60 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14b70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
14b80 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14b90 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
14ba0 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
14bb0 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
14bc0 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
14bd0 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
14be0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
14bf0 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
14c00 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
14c10 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
14c20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14c30 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14c40 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14c50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14c60 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14c70 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
14c80 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
14c90 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
14ca0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
14cb0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
14cc0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14cd0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
14ce0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
14cf0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
14d00 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
14d10 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
14d20 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
14d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
14d40 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
14d50 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
14d60 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
14d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14d80 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
14d90 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
14da0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
14db0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14dc0 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
14dd0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
14de0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
14df0 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
14e00 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
14e10 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14e20 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
14e30 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14e40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14e50 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14e60 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
14e70 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
14e80 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
14e90 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  K );.      /* Qu
14ea0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
14eb0 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
14ec0 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
14ed0 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
14ee0 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
14ef0 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
14f00 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
14f10 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
14f20 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
14f30 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
14f40 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
14f50 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
14f60 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
14f70 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14f80 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
14f90 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
14fa0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
14fb0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
14fc0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
14fd0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
14fe0 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
14ff0 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
15000 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
15010 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
15020 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
15030 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
15040 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
15050 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
15060 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
15070 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
15080 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
15090 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->iOffset = 0;..
150a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
150b0 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
150c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
150d0 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
150e0 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
150f0 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
15100 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
15110 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
15120 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74  ( unionTab==dest
15130 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74  .iSDParm || dest
15140 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
15150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
15160 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
15170 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
15180 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
15190 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
151a0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
151b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
151c0 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
151d0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
151e0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
151f0 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
15200 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
15210 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
15220 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
15230 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
15240 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
15250 28 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d  (pParse, pFirst-
15260 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70  >pSrc, pFirst->p
15270 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
15280 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
15290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
152a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
152b0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
152c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
152d0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
152e0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
152f0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
15300 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
15310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15320 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
15330 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
15340 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15350 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
15360 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
15370 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15380 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
15390 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
153a0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
153b0 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  onTab,.         
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
153d0 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
153e0 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
153f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15400 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
15410 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
15420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15430 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
15440 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
15450 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15470 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15480 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
15490 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
154a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
154b0 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
154c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
154d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
154e0 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
154f0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
15500 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
15510 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
15520 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
15530 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
15540 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
15550 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
15560 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
15570 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
15580 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
15590 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
155a0 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
155b0 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
155c0 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
155d0 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
155e0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
155f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
15600 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
15610 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
15620 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
15630 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
15640 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
15650 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
15660 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
15670 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
15680 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
15690 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
156a0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
156b0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
156c0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
156d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
156e0 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
156f0 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
15700 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
15710 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
15720 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
15730 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
15740 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
15750 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
15760 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
15770 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
15780 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
15790 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
157a0 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
157b0 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
157c0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
157d0 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
157e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
157f0 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
15800 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
15810 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
15820 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
15830 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
15840 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
15850 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15860 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
15870 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
15880 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
15890 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
158a0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
158b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
158c0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
158d0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
158e0 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
158f0 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
15900 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
15910 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15930 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
15940 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
15950 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
15960 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
15970 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
15980 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
15990 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
159a0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
159b0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
159c0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
159d0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
159e0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
159f0 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
15a00 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
15a10 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
15a20 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
15a30 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
15a40 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
15a50 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
15a60 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
15a70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15a80 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
15a90 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
15aa0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
15ab0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
15ac0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
15ad0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
15ae0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
15af0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
15b00 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
15b10 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
15b20 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
15b30 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
15b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15b50 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
15b60 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
15b70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
15b80 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
15b90 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a  set = pOffset;..
15ba0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
15bb0 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
15bc0 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
15bd0 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
15be0 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
15bf0 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
15c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15c10 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
15c20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
15c30 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
15c40 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
15c50 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
15c60 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
15c70 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
15c80 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
15c90 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
15ca0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
15cb0 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e 70  Parse, pFirst->p
15cc0 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  Src, pFirst->pEL
15cd0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
15ce0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
15cf0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15d00 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
15d10 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
15d20 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
15d30 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
15d40 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
15d50 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
15d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d70 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
15d80 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
15d90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15da0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
15db0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
15dc0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
15dd0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
15de0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15df0 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
15e00 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15e10 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
15e20 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
15e30 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20  ab2, iCont, r1, 
15e40 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
15e50 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15e60 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15e70 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
15e80 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
15e90 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
15ea0 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a  ->pEList, tab1,.
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
15ed0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
15ee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15ef0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15f00 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
15f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f20 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15f30 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56  tab1, iStart); V
15f40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15f60 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15f70 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
15f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15f90 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
15fa0 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
15fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15fc0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
15fd0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
15fe0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
15ff0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
16000 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
16010 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
16020 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a  p->op!=TK_ALL);.
16030 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
16040 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16050 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
16060 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
16070 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
16080 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
16090 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
160a0 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
160b0 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
160c0 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
160d0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
160e0 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
160f0 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
16100 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
16110 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
16120 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16130 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
16140 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
16150 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
16160 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
16170 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
16180 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
16190 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
161a0 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
161b0 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
161c0 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
161d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
161e0 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
161f0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
16200 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16220 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
16230 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
16240 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
16250 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
16260 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
16270 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
16280 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
16290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
162a0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
162b0 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
162c0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
162d0 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
162e0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
162f0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
16300 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
16310 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
16320 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16340 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
16350 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
16360 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
16370 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  p->pNext==0 );. 
16380 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
16390 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
163a0 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
163b0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
163c0 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  b, nCol, 1);.   
163d0 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
163e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
163f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
16400 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
16410 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
16420 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20   }.    for(i=0, 
16430 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
16440 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
16450 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
16460 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
16470 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
16480 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
16490 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
164a0 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
164b0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
164c0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
164d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
164e0 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
164f0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
16500 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
16510 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
16520 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
16530 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
16540 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
16550 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
16560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
16570 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
16580 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
16590 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
165a0 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
165b0 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
165c0 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
165d0 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
165e0 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
165f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
16600 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
16610 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
16620 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16630 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16650 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
16660 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
16670 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16680 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
16690 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
166a0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
166b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
166d0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
166e0 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
166f0 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
16700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16710 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
16720 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
16730 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
16740 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
16750 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64  iSdst = dest.iSd
16760 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64  st;.  pDest->nSd
16770 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b  st = dest.nSdst;
16780 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
16790 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65  Delete(db, pDele
167a0 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  te);.  return rc
167b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
167c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
167d0 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
167e0 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  .** Error messag
167f0 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f  e for when two o
16800 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  r more terms of 
16810 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
16820 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  t have different
16830 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20  .** size result 
16840 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sets..*/.void sq
16850 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67  lite3SelectWrong
16860 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61  NumTermsError(Pa
16870 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
16880 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
16890 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
168a0 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71  Values ){.    sq
168b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
168c0 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
168d0 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
168e0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
168f0 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  erms");.  }else{
16900 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16910 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
16920 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
16930 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
16940 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
16950 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
16960 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
16970 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
16980 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
16990 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
169a0 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
169b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
169c0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
169d0 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
169e0 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
169f0 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
16a00 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
16a10 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
16a20 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
16a30 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
16a40 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
16a50 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
16a60 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
16a70 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
16a80 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
16a90 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
16aa0 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
16ab0 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
16ac0 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
16ad0 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
16ae0 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
16af0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
16b00 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
16b10 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
16b20 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
16b30 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
16b40 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
16b50 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
16b60 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
16b70 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
16b80 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
16b90 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
16ba0 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
16bb0 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
16bc0 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
16bd0 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
16be0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
16bf0 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
16c00 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
16c10 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
16c20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
16c30 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
16c40 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
16c50 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
16c60 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
16c70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
16c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
16c90 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
16ca0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
16cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16cc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16cd0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
16ce0 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
16cf0 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
16d00 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
16d10 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
16d20 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
16d30 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
16d40 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
16d50 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
16d60 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
16d70 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
16d80 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
16d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
16da0 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
16db0 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
16dc0 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
16dd0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16de0 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
16df0 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
16e00 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
16e10 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
16e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
16e30 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
16e40 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
16e50 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
16e60 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
16e70 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
16e80 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
16e90 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
16ea0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
16eb0 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
16ec0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
16ed0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
16ee0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
16ef0 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
16f00 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
16f10 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
16f20 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
16f30 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
16f40 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
16f50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16f60 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
16f70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16f80 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  v);.    addr2 = 
16f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16fa0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
16fb0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
16fc0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
16fd0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
17000 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
17010 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
17020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17030 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
17040 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69 43  ump, addr2+2, iC
17050 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b 32  ontinue, addr2+2
17060 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17070 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
17080 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17090 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
170a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
170b0 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53  OP_Copy, pIn->iS
170c0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
170d0 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20  pIn->nSdst-1);. 
170e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
170f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
17100 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
17110 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
17120 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
17130 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
17140 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
17150 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
17160 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
17170 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
17180 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
17190 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
171a0 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
171b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 65  ;..  assert( pDe
171c0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45  st->eDest!=SRT_E
171d0 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72  xists );.  asser
171e0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  t( pDest->eDest!
171f0 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
17200 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
17210 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
17220 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
17230 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
17240 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
17250 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
17260 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
17270 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
17280 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
17290 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
172a0 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
172b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
172c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
172d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
172e0 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
172f0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17300 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
17310 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17320 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
17330 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
17340 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
17350 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17360 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
17370 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32  >iSDParm, r1, r2
17380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17390 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
173a0 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
173b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
173c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
173d0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  se, r2);.      s
173e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
173f0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
17400 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17410 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
17420 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17430 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
17440 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
17450 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
17460 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
17470 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17480 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
17490 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
174a0 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
174b0 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20  nSdst>1 );.     
174c0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
174d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
174e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
174f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
17500 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
17510 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
17520 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 31  t, .          r1
17530 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
17540 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
17550 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17560 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
17570 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
17580 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17590 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
175a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
175b0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
175c0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
175d0 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , r1,.          
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
17600 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
17610 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17620 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
17630 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17640 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17650 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
17660 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
17670 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
17680 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
17690 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
176a0 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
176b0 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
176c0 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
176d0 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
176e0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
176f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
17700 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
17710 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
17720 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =1 || pParse->nE
17730 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73  rr>0 );  testcas
17740 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31  e( pIn->nSdst!=1
17750 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17760 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
17770 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
17780 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
17790 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
177a0 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
177b0 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
177c0 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
177d0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
177e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
177f0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
17800 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
17810 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
17820 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
17830 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
17840 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
17850 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
17860 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
17870 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
17880 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
17890 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
178a0 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
178b0 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
178c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
178d0 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
178e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
178f0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
17900 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
17910 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
17920 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
17930 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
17940 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
17950 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
17960 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49  pDest->iSdst, pI
17970 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17990 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
179a0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
179b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
179c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
179d0 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
179e0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
179f0 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
17a00 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
17a10 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
17a20 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
17a30 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
17a40 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
17a50 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
17a60 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
17a70 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
17a80 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
17a90 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
17aa0 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
17ab0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
17ac0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
17ad0 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
17ae0 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
17af0 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
17b00 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
17b10 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
17b20 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
17b30 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
17b40 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
17b50 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
17b60 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
17b70 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
17b80 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
17b90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17ba0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
17bb0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
17bc0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
17bd0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
17be0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
17bf0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
17c00 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17c10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
17c30 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
17c40 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
17c50 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
17c60 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
17c70 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
17c80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17c90 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
17ca0 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
17cb0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
17cc0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
17cd0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
17ce0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
17cf0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
17d00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17d10 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
17d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17d30 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
17d40 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
17d50 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
17d60 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
17d70 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
17d80 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
17d90 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
17da0 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
17db0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
17dc0 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
17dd0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
17de0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
17df0 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
17e00 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
17e10 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
17e20 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
17e30 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
17e40 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
17e50 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
17e60 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
17e70 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
17e80 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
17e90 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
17ea0 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
17eb0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
17ec0 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
17ed0 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
17ee0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
17ef0 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
17f00 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
17f10 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
17f20 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
17f30 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
17f40 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
17f50 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
17f60 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
17f70 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
17f80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
17f90 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
17fa0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
17fb0 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
17fc0 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
17fe0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
17ff0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
18000 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
18010 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
18020 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
18030 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
18050 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
18060 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
18070 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
18080 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
18090 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
180a0 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
180b0 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
180c0 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
180d0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
180e0 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
180f0 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
18100 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
18110 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
18120 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
18130 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
18140 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
18150 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
18160 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
18170 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
18180 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
18190 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
181a0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
181b0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
181c0 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
181d0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
181e0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
181f0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
18200 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
18210 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
18220 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
18230 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
18240 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
18250 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
18260 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
18270 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
18280 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
18290 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
182a0 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
182b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
182c0 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
182d0 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
182e0 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
182f0 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
18300 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
18310 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
18320 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
18330 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
18340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
18350 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
18360 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
18370 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
18380 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
18390 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
183a0 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
183b0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
183c0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
183d0 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
183e0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
183f0 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
18400 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
18410 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
18420 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
18430 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
18440 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
18450 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
18460 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
18470 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
18480 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
18490 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
184a0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
184b0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
184c0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
184d0 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
184e0 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
184f0 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
18500 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
18510 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
18520 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
18530 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
18540 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
18550 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
18560 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
18570 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
18580 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
18590 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
185a0 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
185b0 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
185c0 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
185d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
185e0 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
185f0 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
18600 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
18610 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
18620 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
18630 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
18640 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
18650 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
18660 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
18670 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
18680 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
18690 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
186a0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
186b0 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
186c0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
186d0 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
186e0 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
186f0 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
18700 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
18710 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
18720 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
18730 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
18740 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
18750 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
18760 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
18770 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
18780 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
18790 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
187a0 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
187b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
187c0 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
187d0 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
187e0 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
187f0 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
18800 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
18810 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
18820 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
18830 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
18840 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
18850 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
18860 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
18870 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
18880 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
18890 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
188a0 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
188b0 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
188c0 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
188d0 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
188e0 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
188f0 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
18900 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
18910 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
18920 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
18930 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
18940 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
18950 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
18960 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
18970 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
18980 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
18990 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
189a0 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
189b0 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
189c0 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
189d0 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
189e0 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
189f0 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
18a00 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
18a10 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
18a20 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
18a30 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
18a40 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
18a50 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
18a60 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
18a70 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
18a80 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
18a90 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
18aa0 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
18ab0 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
18ac0 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
18ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
18ae0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
18af0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
18b00 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
18b10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
18b20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
18b30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
18b40 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
18b50 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
18b60 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
18b70 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
18b80 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
18b90 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
18ba0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
18bb0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
18bc0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
18bd0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
18be0 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
18bf0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
18c00 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
18c10 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
18c20 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
18c30 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
18c40 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
18c50 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
18c60 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
18c70 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
18c80 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
18c90 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
18ca0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
18cb0 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
18cc0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
18cd0 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
18ce0 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
18cf0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
18d00 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
18d10 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
18d20 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
18d30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18d40 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
18d50 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
18d60 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18d70 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
18d80 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18d90 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
18da0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18db0 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
18dc0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18dd0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
18de0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
18df0 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
18e00 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
18e10 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
18e20 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
18e30 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
18e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
18e50 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18e60 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
18e70 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18e80 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
18e90 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18ea0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
18eb0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18ec0 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
18ed0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
18ee0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
18ef0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18f00 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
18f10 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18f20 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
18f30 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
18f40 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18f50 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
18f60 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
18f70 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
18f80 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
18f90 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
18fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18fb0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
18fc0 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
18fd0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18fe0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
18ff0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19000 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
19010 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
19020 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
19030 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19040 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
19050 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
19060 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
19070 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
19080 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
19090 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
190a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
190b0 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
190c0 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
190d0 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
190e0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
190f0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
19100 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
19110 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
19120 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
19130 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
19140 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
19150 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
19160 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
19170 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
19180 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
19190 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
191a0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
191b0 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
191c0 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
191d0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
191e0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
191f0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
19200 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
19210 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
19220 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
19230 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
19240 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
19250 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
19260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
19270 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
19280 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
19290 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
192a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
192b0 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
192c0 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
192d0 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
192e0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
192f0 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
19300 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
19310 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
19320 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
19330 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
19340 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
19350 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
19360 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
19370 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
19380 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
19390 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
193a0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
193b0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
193c0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
193d0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
193e0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
193f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19400 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
19410 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
19420 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
19430 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
19440 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
19450 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
19460 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
19470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19480 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
19490 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
194a0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
194b0 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
194c0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
194d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
194e0 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
194f0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
19500 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
19510 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
19520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
19530 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
19540 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
19550 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
19560 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
19570 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
19580 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
19590 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
195a0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
195b0 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
195c0 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
195d0 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
195e0 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
195f0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19600 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
19610 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19620 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
19630 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
19640 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
19650 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
19660 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
19670 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
19680 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
19690 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
196a0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
196b0 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
196c0 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
196d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
196e0 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
196f0 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
19700 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
19710 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
19720 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
19730 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19740 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
19750 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
19760 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
19770 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
19780 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19790 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
197a0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
197b0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
197c0 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
197d0 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
197e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
197f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
19800 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19810 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
19820 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
19830 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
19840 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
19850 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
19860 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
19870 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
19880 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19890 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
198a0 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
198b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
198c0 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
198d0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
198e0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
198f0 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
19900 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
19910 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
19920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
19930 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
19940 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
19950 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
19960 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
19970 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ue = i;.        
19980 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
19990 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
199a0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
199b0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
199c0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
199d0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
199e0 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65  OrderBy->a[nOrde
199f0 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65  rBy++].u.x.iOrde
19a00 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b  rByCol = (u16)i;
19a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19a20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
19a30 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
19a40 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20  permutation and 
19a50 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20  keyinfo that is 
19a60 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  used with.  ** t
19a70 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75  he permutation u
19a80 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
19a90 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a   if the next.  *
19aa0 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73  * row of results
19ab0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65   comes from sele
19ac0 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20  ctA or selectB. 
19ad0 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63   Also add explic
19ae0 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  it.  ** collatio
19af0 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ns to the ORDER 
19b00 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
19b10 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
19b20 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a   subqueries.  **
19b30 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e   to the right an
19b40 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65  d the left are e
19b50 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75  valuated, they u
19b60 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  se the correct. 
19b70 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20   ** collation.. 
19b80 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   */.  aPermute =
19b90 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
19ba0 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
19bb0 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42 79 20  (int)*(nOrderBy 
19bc0 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61 50 65  + 1));.  if( aPe
19bd0 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
19be0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19bf0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 50  m *pItem;.    aP
19c00 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64  ermute[0] = nOrd
19c10 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d  erBy;.    for(i=
19c20 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  1, pItem=pOrderB
19c30 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42  y->a; i<=nOrderB
19c40 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
19c50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19c60 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
19c70 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
19c80 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
19c90 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19ca0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
19cb0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72  pr );.      aPer
19cc0 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  mute[i] = pItem-
19cd0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19ce0 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
19cf0 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74  pKeyMerge = mult
19d00 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
19d10 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
19d20 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
19d30 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
19d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
19d50 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
19d60 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
19d70 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
19d80 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
19d90 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
19da0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
19db0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
19dc0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
19dd0 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
19de0 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
19df0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
19e00 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
19e10 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
19e20 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
19e30 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
19e40 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
19e50 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
19e60 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
19e70 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
19e80 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
19e90 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
19ea0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
19eb0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
19ec0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
19ed0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
19ee0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
19ef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
19f00 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
19f10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19f20 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
19f30 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
19f40 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
19f50 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
19f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19f70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19f80 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
19f90 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
19fa0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
19fb0 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31  loc(db, nExpr, 1
19fc0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
19fd0 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  up ){.      asse
19fe0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
19ff0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
1a000 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20  eyDup) );.      
1a010 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
1a020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1a030 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
1a040 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
1a050 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1a060 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
1a070 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
1a080 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
1a090 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
1a0a0 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
1a0b0 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
1a0c0 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
1a0d0 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
1a0e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1a0f0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1a100 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
1a110 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1a120 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
1a130 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
1a140 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
1a150 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
1a160 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1a170 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
1a180 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
1a190 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
1a1a0 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
1a1b0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
1a1c0 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
1a1d0 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
1a1e0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
1a1f0 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
1a200 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
1a210 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
1a220 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
1a230 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a240 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
1a250 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a270 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1a280 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
1a290 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
1a2a0 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1a2d0 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
1a2e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a2f0 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
1a300 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
1a310 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1a320 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
1a330 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
1a340 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1a350 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
1a360 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
1a370 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
1a380 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
1a390 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66  ffset);.  p->pOf
1a3a0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  fset = 0;..  reg
1a3b0 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
1a3c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
1a3d0 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
1a3e0 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
1a3f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a400 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
1a410 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
1a420 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1a430 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
1a440 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1a450 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
1a460 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
1a470 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
1a480 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
1a490 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a4a0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1a4b0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1a4c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
1a4d0 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
1a4e0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
1a4f0 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
1a500 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1a510 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
1a520 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1a530 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1a540 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1a550 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1a560 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1a570 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53  gAddrA, 0, addrS
1a580 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43  electA);.  VdbeC
1a590 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74  omment((v, "left
1a5a0 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
1a5b0 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
1a5c0 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c  egLimitA;.  expl
1a5d0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
1a5e0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
1a5f0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
1a600 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1a610 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
1a620 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
1a630 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1a640 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  v, regAddrA);.  
1a650 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1a660 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
1a670 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1a680 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
1a690 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
1a6a0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
1a6b0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
1a6c0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
1a6d0 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1a6e0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1a6f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1a700 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1a710 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a720 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1a730 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
1a740 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
1a750 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1a760 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
1a770 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
1a780 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
1a790 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
1a7a0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
1a7b0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
1a7c0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1a7d0 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
1a7e0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
1a7f0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
1a800 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
1a810 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1a820 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
1a830 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
1a840 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
1a850 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
1a860 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
1a870 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
1a880 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
1a890 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1a8a0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1a8b0 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1a8c0 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
1a8d0 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1a8e0 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1a8f0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1a900 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
1a910 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a920 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
1a930 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
1a940 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
1a950 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
1a960 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
1a970 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
1a980 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
1a990 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
1a9a0 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
1a9b0 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
1a9c0 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
1a9d0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1a9e0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
1a9f0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1aa00 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
1aa10 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
1aa20 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
1aa30 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
1aa40 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
1aa50 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
1aa60 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
1aa70 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1aa80 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
1aa90 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
1aaa0 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
1aab0 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1aac0 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aae0 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
1aaf0 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1ab10 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1ab20 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  belEnd);.  }.  s
1ab30 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
1ab40 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20  ef(pKeyDup);..  
1ab50 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1ab60 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1ab70 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1ab80 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
1ab90 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1aba0 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1abb0 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
1abc0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1abd0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
1abe0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1abf0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1ac00 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41  A_noB = addrEofA
1ac10 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d   = labelEnd;.  }
1ac20 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1ac30 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1ac40 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
1ac50 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1ac60 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
1ac70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1ac80 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1ac90 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72  rOutB);.    addr
1aca0 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74  EofA_noB = sqlit
1acb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1acc0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1acd0 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  rB, labelEnd);. 
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ad10 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1ad20 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
1ad30 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
1ad40 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
1ad50 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
1ad60 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
1ad70 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
1ad80 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1ad90 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1ada0 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1adb0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1adc0 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
1add0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1ade0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1adf0 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
1ae00 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
1ae10 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1ae20 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
1ae30 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
1ae40 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
1ae50 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
1ae60 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1ae70 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1ae80 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
1ae90 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1aea0 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
1aeb0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1aec0 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
1aed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1aee0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1aef0 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1af00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1af10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1af20 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62  d, regAddrA, lab
1af30 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  elEnd); VdbeCove
1af40 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1af50 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1af60 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
1af70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1af80 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1af90 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
1afa0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1afb0 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
1afc0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1afd0 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
1afe0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1aff0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1b000 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1b010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b020 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b030 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1b040 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1b050 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1b060 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b070 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
1b080 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1b090 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1b0a0 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
1b0b0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1b0c0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1b0d0 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
1b0e0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1b0f0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1b100 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1b110 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
1b120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
1b130 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1b140 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
1b150 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1b160 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
1b170 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b180 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b190 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1b1a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b1b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b1c0 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1b1d0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
1b1e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1b1f0 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1b200 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
1b210 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1b220 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
1b230 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
1b240 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1b250 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1b260 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1b270 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1b280 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1b290 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b2a0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1b2b0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
1b2c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b2d0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b2e0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1b2f0 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1b300 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1b310 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b320 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
1b330 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
1b340 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
1b350 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
1b360 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1b370 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1b380 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b390 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b3a0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1b3b0 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43  EofA_noB); VdbeC
1b3c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b3d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b3e0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b3f0 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1b400 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b410 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
1b420 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
1b430 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
1b440 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1b450 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
1b460 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
1b470 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
1b480 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
1b490 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
1b4a0 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
1b4b0 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
1b4c0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1b4d0 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
1b4e0 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
1b4f0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
1b520 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
1b530 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b540 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
1b550 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73  AG_PERMUTE);.  s
1b560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b570 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
1b580 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c  rAltB, addrAeqB,
1b590 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65   addrAgtB); Vdbe
1b5a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1b5b0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
1b5c0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
1b5d0 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
1b5e0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1b5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b600 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1b610 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65  elEnd);..  /* Se
1b620 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1b630 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20  output columns. 
1b640 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
1b650 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
1b660 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ut ){.    Select
1b670 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f   *pFirst = pPrio
1b680 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46  r;.    while( pF
1b690 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
1b6a0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
1b6b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65  pPrior;.    gene
1b6c0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
1b6d0 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e  pParse, pFirst->
1b6e0 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45  pSrc, pFirst->pE
1b6f0 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
1b700 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1b710 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1b720 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1b730 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1b740 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1b750 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1b760 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1b770 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b780 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1b790 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1b7a0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1b7b0 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1b7c0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1b7d0 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1b7e0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1b7f0 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1b800 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1b810 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1b820 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
1b830 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
1b840 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
1b850 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
1b860 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
1b870 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rr!=0;.}.#endif.
1b880 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1b890 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1b8a0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1b8b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1b8c0 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63  )../* An instanc
1b8d0 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f  e of the SubstCo
1b8e0 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73  ntext object des
1b8f0 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69  cribes an substi
1b900 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74  tution edit.** t
1b910 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  o be performed o
1b920 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a  n a parse tree..
1b930 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65  **.** All refere
1b940 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
1b950 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20  in table iTable 
1b960 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  are to be replac
1b970 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64  ed by correspond
1b980 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
1b990 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f  ns in pEList..*/
1b9a0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1b9b0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20  SubstContext {. 
1b9c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1b9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b9e0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1b9f0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  t */.  int iTabl
1ba00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ba10 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65   /* Replace refe
1ba20 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
1ba30 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  able */.  int iN
1ba40 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  ewTable;        
1ba50 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65      /* New table
1ba60 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
1ba70 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20   isLeftJoin;    
1ba80 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b         /* Add TK
1ba90 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63  _IF_NULL_ROW opc
1baa0 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70  odes on each rep
1bab0 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  lacement */.  Ex
1bac0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1bad0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61          /* Repla
1bae0 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f  cement expressio
1baf0 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e  ns */.} SubstCon
1bb00 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72  text;../* Forwar
1bb10 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
1bb20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1bb30 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73  bstExprList(Subs
1bb40 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c  tContext*, ExprL
1bb50 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1bb60 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53  id substSelect(S
1bb70 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65  ubstContext*, Se
1bb80 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  lect*, int);../*
1bb90 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
1bba0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1bbb0 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
1bbc0 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
1bbd0 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
1bbe0 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
1bbf0 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
1bc00 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
1bc10 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
1bc20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
1bc30 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
1bc40 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
1bc50 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
1bc60 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
1bc70 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
1bc80 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
1bc90 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
1bca0 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
1bcb0 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
1bcc0 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
1bcd0 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
1bce0 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
1bcf0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
1bd00 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
1bd10 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
1bd20 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
1bd30 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
1bd40 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
1bd50 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
1bd60 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
1bd70 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
1bd80 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
1bd90 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
1bda0 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
1bdb0 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
1bdc0 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
1bdd0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1bde0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
1bdf0 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
1be00 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74  bstExpr(.  Subst
1be10 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1be20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1be30 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1be40 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1be50 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
1be60 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
1be70 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
1be80 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  ccurs */.){.  if
1be90 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1bea0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70  urn 0;.  if( Exp
1beb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1bec0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
1bed0 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68   && pExpr->iRigh
1bee0 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62  tJoinTable==pSub
1bef0 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20  st->iTable ){.  
1bf00 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a    pExpr->iRightJ
1bf10 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62 73  oinTable = pSubs
1bf20 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1bf30 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
1bf40 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
1bf50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1bf60 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b  Subst->iTable ){
1bf70 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1bf80 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
1bf90 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1bfa0 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
1bfb0 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
1bfc0 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
1bfd0 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74 2d  *pCopy = pSubst-
1bfe0 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72  >pEList->a[pExpr
1bff0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
1c000 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66 4e  ;.      Expr ifN
1c010 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61 73  ullRow;.      as
1c020 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70 45  sert( pSubst->pE
1c030 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
1c040 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73 74  ->iColumn<pSubst
1c050 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1c060 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c070 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
1c080 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
1c090 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t==0 );.      if
1c0a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1c0b0 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a  ector(pCopy) ){.
1c0c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c0d0 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 53  ectorErrorMsg(pS
1c0e0 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 43  ubst->pParse, pC
1c0f0 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  opy);.      }els
1c100 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1c110 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74 2d  e3 *db = pSubst-
1c120 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20  >pParse->db;.   
1c130 20 20 20 20 20 69 66 28 20 70 53 75 62 73 74 2d       if( pSubst-
1c140 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70  >isLeftJoin && p
1c150 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Copy->op!=TK_COL
1c160 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
1c170 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52   memset(&ifNullR
1c180 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 66  ow, 0, sizeof(if
1c190 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20  NullRow));.     
1c1a0 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f       ifNullRow.o
1c1b0 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  p = TK_IF_NULL_R
1c1c0 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OW;.          if
1c1d0 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20  NullRow.pLeft = 
1c1e0 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  pCopy;.         
1c1f0 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c   ifNullRow.iTabl
1c200 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77  e = pSubst->iNew
1c210 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1c220 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c   pCopy = &ifNull
1c230 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Row;.        }. 
1c240 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1c250 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1c260 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20   pCopy, 0);.    
1c270 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
1c280 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
1c290 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1c2a0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1c2b0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1c2c0 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  = pExpr->iRightJ
1c2d0 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  oinTable;.      
1c2e0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
1c2f0 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a  |= EP_FromJoin;.
1c300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c310 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1c320 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
1c330 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
1c340 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNew;.      }.  
1c350 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1c360 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
1c370 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1c380 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1c390 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  .    pExpr->pRig
1c3a0 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ht = substExpr(p
1c3b0 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52  Subst, pExpr->pR
1c3c0 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45  ight);.    if( E
1c3d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c3e0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1c3f0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
1c400 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c  stSelect(pSubst,
1c410 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1c420 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 1);.    }else
1c430 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1c440 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 45  rList(pSubst, pE
1c450 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
1c460 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c470 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
1c480 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1c490 4c 69 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e  List(.  SubstCon
1c4a0 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a  text *pSubst, /*
1c4b0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1c4c0 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1c4d0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1c4e0 70 4c 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c  pList       /* L
1c4f0 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
1c500 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1c510 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
1c520 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1c530 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1c540 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1c550 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1c560 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  i++){.    pList-
1c570 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75  >a[i].pExpr = su
1c580 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1c590 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1c5a0 72 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  r);.  }.}.static
1c5b0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1c5c0 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78  t(.  SubstContex
1c5d0 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65  t *pSubst, /* De
1c5e0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1c5f0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1c600 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1c610 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
1c620 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1c630 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1c640 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
1c650 20 69 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20   int doPrior    
1c660 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62         /* Do sub
1c670 73 74 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70  stitutes on p->p
1c680 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a  Prior too */.){.
1c690 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1c6a0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1c6b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1c6c0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70   int i;.  if( !p
1c6d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b   ) return;.  do{
1c6e0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1c6f0 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45  st(pSubst, p->pE
1c700 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
1c710 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1c720 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20   p->pGroupBy);. 
1c730 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1c740 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64  (pSubst, p->pOrd
1c750 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48  erBy);.    p->pH
1c760 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1c770 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61  r(pSubst, p->pHa
1c780 76 69 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57  ving);.    p->pW
1c790 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1c7a0 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65  (pSubst, p->pWhe
1c7b0 72 65 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  re);.    pSrc = 
1c7c0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73  p->pSrc;.    ass
1c7d0 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
1c7e0 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
1c7f0 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63  nSrc, pItem=pSrc
1c800 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
1c810 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
1c820 75 62 73 74 53 65 6c 65 63 74 28 70 53 75 62 73  ubstSelect(pSubs
1c830 74 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  t, pItem->pSelec
1c840 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
1c850 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
1c860 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
1c870 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1c880 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e  ubst, pItem->u1.
1c890 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20  pFuncArg);.     
1c8a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
1c8b0 65 28 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70  e( doPrior && (p
1c8c0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30   = p->pPrior)!=0
1c8d0 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   );.}.#endif /* 
1c8e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1c8f0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1c900 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1c910 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1c920 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1c930 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1c940 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1c950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1c960 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
1c970 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1c980 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
1c990 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
1c9a0 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
1c9b0 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
1c9c0 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
1c9d0 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
1c9e0 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
1c9f0 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
1ca00 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
1ca10 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
1ca20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
1ca30 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1ca40 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
1ca50 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1ca60 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
1ca70 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1ca80 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
1ca90 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
1caa0 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
1cab0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
1cac0 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
1cad0 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
1cae0 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
1caf0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1cb00 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
1cb10 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
1cb20 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
1cb30 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
1cb40 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
1cb50 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
1cb60 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
1cb70 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
1cb80 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
1cb90 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1cba0 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
1cbb0 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
1cbc0 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
1cbd0 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1cbe0 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
1cbf0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1cc00 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
1cc10 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
1cc20 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
1cc30 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
1cc40 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
1cc50 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
1cc60 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
1cc70 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1cc80 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
1cc90 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
1cca0 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
1ccb0 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74  this simplificat
1ccc0 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
1ccd0 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
1cce0 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
1ccf0 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
1cd00 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
1cd10 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
1cd20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
1cd30 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
1cd40 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
1cd50 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
1cd60 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
1cd70 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
1cd80 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
1cd90 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1cda0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1cdb0 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
1cdc0 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1cdd0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1cde0 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
1cdf0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
1ce00 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1ce10 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1ce20 67 61 74 65 20 6f 72 20 28 32 61 29 20 74 68 65  gate or (2a) the
1ce30 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1ce40 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20  not a join.**   
1ce50 20 20 20 20 20 61 6e 64 20 28 32 62 29 20 74 68       and (2b) th
1ce60 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1ce70 65 73 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75  es not use subqu
1ce80 65 72 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e  eries other than
1ce90 20 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20   the one.**     
1cea0 20 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73     FROM-clause s
1ceb0 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20  ubquery that is 
1cec0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
1ced0 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62  flattening.  (2b
1cee0 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75   is.**        du
1cef0 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37  e to ticket [2f7
1cf00 31 37 30 64 37 33 62 66 39 61 62 66 38 30 5d 20  170d73bf9abf80] 
1cf10 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e  from 2015-02-09.
1cf20 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54  ).**.**   (3)  T
1cf30 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1cf40 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  ot the right ope
1cf50 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
1cf60 4f 49 4e 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72  OIN.**        or
1cf70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1cf80 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
1cf90 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  in..**.**   (4) 
1cfa0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1cfb0 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a   not DISTINCT..*
1cfc0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
1cfd0 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
1cfe0 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
1cff0 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
1d000 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
1d010 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
1d020 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
1d030 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
1d040 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
1d050 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
1d060 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
1d070 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
1d080 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
1d090 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
1d0a0 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  eries..**.**   (
1d0b0 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
1d0c0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1d0d0 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1d0e0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1d0f0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1d100 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
1d110 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
1d120 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
1d130 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
1d140 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
1d150 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
1d160 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
1d170 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
1d180 4f 4d 20 63 6c 61 75 73 65 20 77 69 74 68 20 74  OM clause with t
1d190 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1d1a0 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1d1b0 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1d1c0 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1d1d0 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1d1e0 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1d1f0 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1d200 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
1d210 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1d220 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1d230 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1d240 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1d250 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
1d260 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1d270 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1d280 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1d290 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1d2a0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1d2b0 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74    (**)  Restrict
1d2c0 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d  ion (10) was rem
1d2d0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f  oved from the co
1d2e0 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35  de on 2005-02-05
1d2f0 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   but we.**      
1d300 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72    accidently car
1d310 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ried the comment
1d320 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32   forward until 2
1d330 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67  014-09-15.  Orig
1d340 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  inal.**        t
1d350 65 78 74 3a 20 22 54 68 65 20 73 75 62 71 75 65  ext: "The subque
1d360 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1d370 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
1d380 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a  e outer query .*
1d390 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f  *        does no
1d3a0 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a  t use LIMIT.".**
1d3b0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
1d3c0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1d3d0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1d3e0 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
1d3f0 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
1d400 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
1d410 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
1d420 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
1d430 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
1d440 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
1d450 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
1d460 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
1d470 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
1d480 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
1d490 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
1d4a0 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
1d4b0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1d4c0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
1d4d0 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
1d4e0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1d4f0 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
1d500 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
1d510 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
1d520 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1d530 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
1d540 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
1d550 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
1d560 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
1d570 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
1d580 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
1d590 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
1d5a0 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
1d5b0 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1d5c0 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1d5d0 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
1d5e0 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
1d5f0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
1d600 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
1d610 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
1d620 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
1d630 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
1d640 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
1d650 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
1d660 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
1d670 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
1d680 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1d690 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
1d6a0 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
1d6b0 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
1d6c0 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
1d6d0 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
1d6e0 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
1d6f0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
1d700 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
1d710 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1d720 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1d730 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
1d740 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1d750 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
1d760 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1d770 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1d780 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
1d790 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
1d7a0 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
1d7b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1d7c0 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1d7d0 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1d7e0 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1d7f0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1d800 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1d810 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1d820 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1d830 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1d840 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1d850 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1d860 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1d870 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1d880 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1d890 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1d8a0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1d8b0 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1d8c0 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1d8d0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1d8e0 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1d8f0 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1d900 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1d910 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1d920 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1d930 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1d940 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1d950 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1d960 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1d970 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1d980 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1d990 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1d9a0 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1d9b0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1d9c0 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1d9d0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1d9e0 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1d9f0 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1da00 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1da10 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1da20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1da30 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1da40 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1da50 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1da60 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1da70 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1da80 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1da90 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1daa0 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1dab0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1dac0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1dad0 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1dae0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1daf0 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
1db00 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1db10 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1db20 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1db30 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1db40 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1db50 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
1db60 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1db70 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1db80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1db90 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
1dba0 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
1dbb0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
1dbc0 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
1dbd0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1dbe0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1dbf0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
1dc00 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
1dc10 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1dc20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
1dc30 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
1dc40 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
1dc50 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
1dc60 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
1dc70 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1dc80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1dc90 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
1dca0 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
1dcb0 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
1dcc0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
1dcd0 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
1dce0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
1dcf0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
1dd00 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
1dd10 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
1dd20 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
1dd30 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1dd40 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1dd50 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1dd60 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1dd70 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
1dd80 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
1dd90 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
1dda0 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75   (22)  The subqu
1ddb0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ery is not a rec
1ddc0 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
1ddd0 2a 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72  *  (23)  The par
1dde0 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ent is not a rec
1ddf0 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74  ursive CTE, or t
1de00 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1de10 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  not a.**        
1de20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1de30 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
1de40 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e   is because tran
1de50 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20  sforming the.** 
1de60 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f         parent to
1de70 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1de80 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63  y confuses the c
1de90 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73  ode that handles
1dea0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72  .**        recur
1deb0 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20  sive queries in 
1dec0 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a  multiSelect()..*
1ded0 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20  *.**  (24)  The 
1dee0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1def0 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
1df00 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
1df10 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
1df20 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
1df30 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
1df40 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
1df50 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
1df60 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
1df70 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
1df80 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
1df90 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
1dfa0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1dfb0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
1dfc0 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
1dfd0 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
1dfe0 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a  ximal.).**.**.**
1dff0 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
1e000 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
1e010 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
1e020 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
1e030 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
1e040 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
1e050 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
1e060 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1e070 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
1e080 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
1e090 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
1e0a0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1e0b0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1e0c0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1e0d0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1e0e0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
1e0f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e100 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
1e110 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
1e120 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
1e130 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
1e140 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
1e150 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
1e160 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
1e170 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
1e180 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
1e190 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
1e1a0 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
1e1b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
1e1c0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
1e1d0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
1e1e0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
1e1f0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
1e200 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1e210 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1e220 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1e230 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
1e240 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
1e250 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
1e260 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1e270 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
1e280 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
1e290 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
1e2a0 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
1e2b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
1e2c0 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
1e2d0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1e2e0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
1e2f0 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
1e300 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
1e310 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1e320 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1e330 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1e340 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
1e350 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
1e360 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
1e370 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20  lect *pParent;  
1e380 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49    /* Current UNI
1e390 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74  ON ALL term of t
1e3a0 68 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a  he other query *
1e3b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1e3c0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
1e3d0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
1e3e0 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
1e3f0 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
1e400 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1e410 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
1e420 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
1e430 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1e440 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
1e450 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1e460 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e470 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1e480 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
1e490 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e4a0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1e4b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1e4c0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
1e4d0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
1e4e0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1e4f0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
1e500 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1e510 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
1e520 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
1e530 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
1e540 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
1e550 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
1e560 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
1e570 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
1e580 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
1e590 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
1e5a0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
1e5b0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
1e5c0 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e5e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1e5f0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1e620 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1e630 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1e640 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
1e650 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
1e660 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e670 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
1e680 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1e690 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1e6a0 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
1e6b0 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
1e6c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
1e6d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1e6e0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
1e6f0 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
1e700 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
1e710 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ries */.  if( Op
1e720 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1e730 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
1e740 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20  eryFlattener) ) 
1e750 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
1e760 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
1e770 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
1e780 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
1e790 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
1e7a0 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
1e7b0 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50  ->a[iFrom];.  iP
1e7c0 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
1e7d0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75  ->iCursor;.  pSu
1e7e0 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
1e7f0 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
1e800 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
1e810 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1e820 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  ){.    if( isAgg
1e830 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e860 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
1e870 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
1e880 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
1e890 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e8b0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 61 29  Restriction (2a)
1e8c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
1e8d0 3e 70 57 68 65 72 65 20 26 26 20 45 78 70 72 48  >pWhere && ExprH
1e8e0 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 57  asProperty(p->pW
1e8f0 68 65 72 65 2c 45 50 5f 53 75 62 71 75 65 72 79  here,EP_Subquery
1e900 29 29 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69  )).     || (sqli
1e910 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
1e920 28 70 2d 3e 70 45 4c 69 73 74 29 20 26 20 45 50  (p->pEList) & EP
1e930 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20  _Subquery)!=0.  
1e940 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78     || (sqlite3Ex
1e950 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70  prListFlags(p->p
1e960 4f 72 64 65 72 42 79 29 20 26 20 45 50 5f 53 75  OrderBy) & EP_Su
1e970 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20 29  bquery)!=0.    )
1e980 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1e990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e9c0 73 74 72 69 63 74 69 6f 6e 20 28 32 62 29 20 20  striction (2b)  
1e9d0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  */.    }.  }..  
1e9e0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
1e9f0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1ea00 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
1ea10 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
1ea20 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
1ea30 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
1ea40 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
1ea50 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
1ea60 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
1ea70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  ressions, we all
1ea80 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
1ea90 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
1eaa0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
1eab0 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
1eac0 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
1ead0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
1eae0 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
1eaf0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
1eb00 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
1eb10 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
1eb20 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
1eb30 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
1eb40 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
1eb50 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
1eb60 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
1eb70 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb90 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
1eba0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1ebb0 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72  >pOffset ) retur
1ebc0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ebe0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
1ebf0 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73  ) */.  if( (p->s
1ec00 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d  elFlags & SF_Com
1ec10 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75  pound)!=0 && pSu
1ec20 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
1ec30 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1ec70 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
1ec80 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
1ec90 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
1eca0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ecb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ecc0 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
1ecd0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1ece0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1ecf0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
1ed00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ed10 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f  triction (5)  */
1ed20 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1ed30 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
1ed40 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
1ed50 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1ed60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1ed70 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
1ed80 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
1ed90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1eda0 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73  istinct)!=0 && s
1edb0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1edc0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1edd0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1ede0 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
1edf0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
1ee00 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
1ee10 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65  derBy ){.     re
1ee20 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ee60 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (11) */.  }.  i
1ee70 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62  f( isAgg && pSub
1ee80 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
1ee90 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1eea0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1eeb0 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69  tion (16) */.  i
1eec0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1eed0 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  && p->pWhere ) r
1eee0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1eef0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1ef00 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69  tion (19) */.  i
1ef10 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1ef20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
1ef30 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1ef40 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
1ef50 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1ef60 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20  estriction (21) 
1ef70 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  */.  }.  testcas
1ef80 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  e( pSub->selFlag
1ef90 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1efa0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1efb0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1efc0 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b   SF_MinMaxAgg );
1efd0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1efe0 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
1eff0 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41  rsive|SF_MinMaxA
1f000 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  gg) ){.    retur
1f010 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74  n 0; /* Restrict
1f020 69 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32  ions (22) and (2
1f030 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  4) */.  }.  if( 
1f040 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f050 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
1f060 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1f070 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1f080 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33   Restriction (23
1f090 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ) */.  }..  /*. 
1f0a0 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
1f0b0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1f0c0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1f0d0 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
1f0e0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1f0f0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1f100 6e 20 69 74 73 65 6c 66 2e 20 20 45 78 61 6d 70  n itself.  Examp
1f110 6c 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  le of why this i
1f120 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1f130 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1f140 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1f150 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
1f160 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1f170 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1f180 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1f190 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1f1a0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1f1b0 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
1f1c0 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
1f1d0 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
1f1e0 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
1f1f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
1f200 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30 36  lso tickets #306
1f210 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33 30  , #350, and #330
1f220 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  0..  */.  if( (p
1f230 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
1f240 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
1f250 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65 66  !=0 ){.    isLef
1f260 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69  tJoin = 1;.    i
1f270 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1f280 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  >1 ){.      retu
1f290 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
1f2a0 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 20 20  tion (3) */.    
1f2b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  }.  }..  /* Rest
1f2c0 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74  riction 17: If t
1f2d0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1f2e0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
1f2f0 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a  T, then it must.
1f300 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68    ** use only th
1f310 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
1f320 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f  ator. And none o
1f330 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c  f the simple sel
1f340 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a  ect queries.  **
1f350 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
1f360 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
1f370 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  T are allowed to
1f380 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72   be aggregate or
1f390 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71   distinct.  ** q
1f3a0 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  ueries..  */.  i
1f3b0 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  f( pSub->pPrior 
1f3c0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ){.    if( pSub-
1f3d0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1f3e0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
1f3f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20   Restriction 20 
1f400 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
1f410 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65   isAgg || (p->se
1f420 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1f430 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63  inct)!=0 || pSrc
1f440 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20  ->nSrc!=1 ){.   
1f450 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1f460 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31   }.    for(pSub1
1f470 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53  =pSub; pSub1; pS
1f480 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f  ub1=pSub1->pPrio
1f490 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r){.      testca
1f4a0 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
1f4b0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1f4c0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1f4d0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
1f4e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f4f0 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
1f500 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1f510 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1f520 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20  )==SF_Aggregate 
1f530 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f540 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29   pSub->pSrc!=0 )
1f550 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f560 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
1f570 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69  xpr==pSub1->pELi
1f580 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1f590 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73     if( (pSub1->s
1f5a0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1f5b0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1f5c0 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20  ate))!=0.       
1f5d0 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f  || (pSub1->pPrio
1f5e0 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d  r && pSub1->op!=
1f5f0 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20  TK_ALL) .       
1f600 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e  || pSub1->pSrc->
1f610 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 29 7b 0a  nSrc<1.      ){.
1f620 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1f630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f640 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d  testcase( pSub1-
1f650 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b  >pSrc->nSrc>1 );
1f660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1f670 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a  estriction 18. *
1f680 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
1f690 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
1f6a0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
1f6b0 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
1f6c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
1f6d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1f6e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
1f6f0 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ii].u.x.iOrderBy
1f700 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
1f710 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1f720 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49  .  }..  /***** I
1f730 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1f740 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e  point, flattenin
1f750 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
1f760 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54  *****/.  SELECTT
1f770 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
1f780 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20  ("flatten %s.%p 
1f790 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c  from term %d\n",
1f7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f7b0 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61      pSub->zSelNa
1f7c0 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29  me, pSub, iFrom)
1f7d0 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69  );..  /* Authori
1f7e0 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ze the subquery 
1f7f0 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  */.  pParse->zAu
1f800 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62  thContext = pSub
1f810 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54  item->zName;.  T
1f820 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c  ESTONLY(i =) sql
1f830 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1f840 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
1f850 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ECT, 0, 0, 0);. 
1f860 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51   testcase( i==SQ
1f870 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70  LITE_DENY );.  p
1f880 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1f890 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
1f8a0 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49  Context;..  /* I
1f8b0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1f8c0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
1f8d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
1f8e0 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63  then (by restric
1f8f0 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e  tions.  ** 17 an
1f900 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d  d 18 above) it m
1f910 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41  ust be a UNION A
1f920 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e  LL and the paren
1f930 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20  t query must .  
1f940 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  ** be of the for
1f950 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
1f960 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69   SELECT <expr-li
1f970 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71  st> FROM (<sub-q
1f980 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c  uery>) <where-cl
1f990 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ause> .  **.  **
1f9a0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79   followed by any
1f9b0 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
1f9c0 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63   and/or OFFSET c
1f9d0 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f  lauses. This blo
1f9e0 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20  ck.  ** creates 
1f9f0 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68  N-1 copies of th
1fa00 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77  e parent query w
1fa10 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52  ithout any ORDER
1fa20 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20   BY, LIMIT or . 
1fa30 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73   ** OFFSET claus
1fa40 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65  es and joins the
1fa50 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61  m to the left-ha
1fa60 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f  nd-side of the o
1fa70 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69  riginal.  ** usi
1fa80 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  ng UNION ALL ope
1fa90 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20  rators. In this 
1faa0 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75  case N is the nu
1fab0 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20  mber of simple. 
1fac0 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65   ** select state
1fad0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d  ments in the com
1fae0 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e  pound sub-query.
1faf0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
1fb00 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
1fb10 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f    SELECT a+1 FRO
1fb20 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  M (.  **        
1fb30 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
1fb40 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
1fb50 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1fb60 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f      SELECT y FRO
1fb70 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
1fb80 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1fb90 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
1fba0 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62  bs(z*2) FROM tab
1fbb0 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45  2.  **     ) WHE
1fbc0 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59  RE a!=5 ORDER BY
1fbd0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61   1.  **.  ** Tra
1fbe0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20  nsformed into:. 
1fbf0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1fc00 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62  ECT x+1 FROM tab
1fc10 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20   WHERE x+1!=5.  
1fc20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
1fc30 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1fc40 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   y+1 FROM tab WH
1fc50 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE y+1!=5.  ** 
1fc60 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1fc70 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62  **     SELECT ab
1fc80 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61  s(z*2)+1 FROM ta
1fc90 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32  b2 WHERE abs(z*2
1fca0 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  )+1!=5.  **     
1fcb0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
1fcc0 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69    ** We call thi
1fcd0 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d  s the "compound-
1fce0 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
1fcf0 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ing"..  */.  for
1fd00 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69  (pSub=pSub->pPri
1fd10 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  or; pSub; pSub=p
1fd20 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
1fd30 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
1fd40 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
1fd50 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
1fd60 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  erBy;.    Expr *
1fd70 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
1fd80 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f  it;.    Expr *pO
1fd90 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
1fda0 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  et;.    Select *
1fdb0 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
1fdc0 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  or;.    p->pOrde
1fdd0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
1fde0 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pSrc = 0;.    p-
1fdf0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
1fe00 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1fe10 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
1fe20 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   0;.    pNew = s
1fe30 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
1fe40 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73  db, p, 0);.    s
1fe50 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
1fe60 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e  ame(pNew, pSub->
1fe70 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70  zSelName);.    p
1fe80 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
1fe90 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  set;.    p->pLim
1fea0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
1feb0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1fec0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e  OrderBy;.    p->
1fed0 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
1fee0 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b   p->op = TK_ALL;
1fef0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1ff00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   ){.      p->pPr
1ff10 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1ff20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1ff30 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
1ff40 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
1ff50 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
1ff60 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
1ff70 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74       pNew->pNext
1ff80 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = p;.      p->p
1ff90 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20  Prior = pNew;.  
1ffa0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
1ffb0 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20  2,pParse,p,.    
1ffc0 20 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d       ("compound-
1ffd0 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
1ffe0 65 72 20 63 72 65 61 74 65 73 20 25 73 2e 25 70  er creates %s.%p
1fff0 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20   as peer\n",.   
20000 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c        pNew->zSel
20010 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20  Name, pNew));.  
20020 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
20030 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
20040 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
20050 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e  /* Begin flatten
20060 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68  ing the iFrom-th
20070 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
20080 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20  OM clause .  ** 
20090 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
200a0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20  ry..  */.  pSub 
200b0 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74  = pSub1 = pSubit
200c0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  em->pSelect;..  
200d0 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72  /* Delete the tr
200e0 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
200f0 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74  ructure associat
20100 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
20110 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20   subquery.  */. 
20120 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20130 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  b, pSubitem->zDa
20140 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74  tabase);.  sqlit
20150 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
20160 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  bitem->zName);. 
20170 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20180 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  b, pSubitem->zAl
20190 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  ias);.  pSubitem
201a0 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
201b0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  .  pSubitem->zNa
201c0 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  me = 0;.  pSubit
201d0 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
201e0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c    pSubitem->pSel
201f0 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  ect = 0;..  /* D
20200 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  efer deleting th
20210 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61  e Table object a
20220 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
20230 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
20240 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65   until code gene
20250 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  ration is.  ** c
20260 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74  omplete, since t
20270 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65  here may still e
20280 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65  xist Expr.pTab e
20290 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a  ntries that.  **
202a0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75   refer to the su
202b0 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65  bquery even afte
202c0 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54  r flattening.  T
202d0 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a  icket #3346..  *
202e0 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d  *.  ** pSubitem-
202f0 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20  >pTab is always 
20300 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74  non-NULL by test
20310 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e   restrictions an
20320 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20  d tests above.. 
20330 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
20340 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21  (pSubitem->pTab!
20350 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  =0) ){.    Table
20360 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53   *pTabToDel = pS
20370 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ubitem->pTab;.  
20380 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d    if( pTabToDel-
20390 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20  >nTabRef==1 ){. 
203a0 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
203b0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
203c0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
203d0 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
203e0 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
203f0 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
20400 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
20410 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
20420 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
20430 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
20440 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
20450 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20  >nTabRef--;.    
20460 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
20470 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
20480 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
20490 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
204a0 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
204b0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
204c0 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
204d0 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
204e0 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
204f0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
20500 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
20510 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
20520 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
20530 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
20540 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
20550 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
20560 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
20570 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
20580 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
20590 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
205a0 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
205b0 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
205c0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
205d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
205e0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
205f0 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
20600 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
20610 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
20620 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
20630 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
20640 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
20650 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
20660 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
20670 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
20680 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
20690 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
206a0 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
206b0 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
206c0 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
206d0 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
206e0 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
206f0 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
20700 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
20710 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
20720 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
20730 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
20740 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
20750 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
20760 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
20770 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
20780 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
20790 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
207a0 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
207b0 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
207c0 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
207d0 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
207e0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
207f0 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
20800 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
20810 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
20820 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
20830 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
20840 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
20850 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
20860 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
20870 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
20880 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
20890 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
208a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
208b0 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
208c0 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
208d0 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
208e0 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
208f0 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
20900 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
20910 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20920 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
20930 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
20940 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
20950 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
20960 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
20970 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
20980 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
20990 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
209a0 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
209b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
209c0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
209d0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
209e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
209f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
20a00 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
20a10 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
20a20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
20a30 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
20a40 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
20a50 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
20a60 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
20a70 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
20a80 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
20a90 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
20aa0 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
20ab0 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
20ac0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
20ad0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
20ae0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
20af0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
20b00 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
20b10 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
20b20 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
20b30 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
20b40 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
20b50 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
20b60 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
20b70 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
20b80 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
20b90 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
20ba0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
20bb0 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
20bc0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
20bd0 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
20be0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
20bf0 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
20c00 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
20c10 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
20c20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20  to 4 slots..    
20c30 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c  ** The middle sl
20c40 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
20c50 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
20c60 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
20c70 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ce.    ** for th
20c80 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  e two elements i
20c90 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
20ca0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
20cb0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
20cc0 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
20cd0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
20ce0 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
20cf0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
20d00 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
20d10 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
20d20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
20d30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
20d40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20d50 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20d60 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
20d70 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
20d80 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
20d90 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
20da0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
20db0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
20dc0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
20dd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
20de0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
20df0 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
20e00 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
20e10 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
20e20 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e  ->a[i+iFrom].fg.
20e30 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
20e40 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
20e50 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
20e60 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 4e  ->a[i];.      iN
20e70 65 77 50 61 72 65 6e 74 20 3d 20 70 53 75 62 53  ewParent = pSubS
20e80 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
20e90 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
20ea0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
20eb0 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
20ec0 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
20ed0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
20ee0 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  m].fg.jointype =
20ef0 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
20f00 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
20f10 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
20f20 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
20f30 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
20f40 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
20f50 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
20f60 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
20f70 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
20f80 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
20f90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
20fa0 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
20fb0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
20fc0 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
20fd0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
20fe0 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21000 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
21010 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
21020 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
21030 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
21040 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21050 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
21060 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21070 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
21080 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
21090 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
210a0 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
210b0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
210c0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
210d0 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
210e0 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
210f0 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
21100 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
21110 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
21120 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  "..    */.    pL
21130 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ist = pParent->p
21140 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
21150 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
21160 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
21170 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
21180 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
21190 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
211a0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
211b0 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
211c0 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
211d0 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
211e0 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  (zName);.       
211f0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
21200 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
21210 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
21220 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
21230 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20   ){.      /* At 
21240 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20  this point, any 
21250 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42  non-zero iOrderB
21260 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64 69  yCol values indi
21270 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20  cate that the.  
21280 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
21290 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
212a0 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74  n is identical t
212b0 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43 6f  o the iOrderByCo
212c0 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65 78  l'th.      ** ex
212d0 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65  pression returne
212e0 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61 74  d by SELECT stat
212f0 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e 63  ement pSub. Sinc
21300 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a 20  e these values. 
21310 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e       ** do not n
21320 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65  ecessarily corre
21330 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73  spond to columns
21340 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65   in SELECT state
21350 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20 20  ment pParent,.  
21360 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d      ** zero them
21370 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72   before transfer
21380 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
21390 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a   clause..      *
213a0 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64  *.      ** Not d
213b0 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63 61  oing this may ca
213c0 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20  use an error if 
213d0 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  a subsequent cal
213e0 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20  l to this.      
213f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  ** function atte
21400 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
21410 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  a compound sub-q
21420 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65 6e  uery into pParen
21430 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20  t.      ** (the 
21440 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63 61  only way this ca
21450 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20 74  n happen is if t
21460 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
21470 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20 2a  query is.      *
21480 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74  * currently part
21490 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29 2e   of pSub->pSrc).
214a0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31 31   See ticket [d11
214b0 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20  a6e908f].  */.  
214c0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
214d0 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
214e0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 66  OrderBy;.      f
214f0 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
21500 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
21510 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
21520 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  y->a[i].u.x.iOrd
21530 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  erByCol = 0;.   
21540 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
21550 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
21560 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
21570 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
21580 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20  Prior==0 );.    
21590 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65    pParent->pOrde
215a0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
215b0 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64        pSub->pOrd
215c0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  erBy = 0;.    }.
215d0 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
215e0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
215f0 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29  pSub->pWhere, 0)
21600 3b 0a 20 20 20 20 69 66 28 20 69 73 4c 65 66 74  ;.    if( isLeft
21610 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 73 65  Join ){.      se
21620 74 4a 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65  tJoinExpr(pWhere
21630 2c 20 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20  , iNewParent);. 
21640 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62     }.    if( sub
21650 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
21660 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
21670 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ent->pHaving==0 
21680 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
21690 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72  ->pHaving = pPar
216a0 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  ent->pWhere;.   
216b0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
216c0 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
216d0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
216e0 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
216f0 72 41 6e 64 28 64 62 2c 20 0a 20 20 20 20 20 20  rAnd(db, .      
21700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
21710 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
21720 76 69 6e 67 2c 20 30 29 2c 20 70 50 61 72 65 6e  ving, 0), pParen
21730 74 2d 3e 70 48 61 76 69 6e 67 0a 20 20 20 20 20  t->pHaving.     
21740 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21750 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  ( pParent->pGrou
21760 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
21770 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
21780 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
21790 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d  istDup(db, pSub-
217a0 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20  >pGroupBy, 0);. 
217b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
217c0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
217d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
217e0 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61  (db, pWhere, pPa
217f0 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20  rent->pWhere);. 
21800 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
21810 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
21820 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43   ){.      SubstC
21830 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20  ontext x;.      
21840 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  x.pParse = pPars
21850 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c  e;.      x.iTabl
21860 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20  e = iParent;.   
21870 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d     x.iNewTable =
21880 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20   iNewParent;.   
21890 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
218a0 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20  = isLeftJoin;.  
218b0 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70      x.pEList = p
218c0 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  Sub->pEList;.   
218d0 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 26     substSelect(&
218e0 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  x, pParent, 0);.
218f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
21900 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
21910 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
21920 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
21930 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ner or the.    *
21940 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
21950 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20   distinct. .    
21960 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  */.    pParent->
21970 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62  selFlags |= pSub
21980 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
21990 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20  Distinct;.  .   
219a0 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43   /*.    ** SELEC
219b0 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
219c0 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
219d0 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
219e0 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a   OFFSET y;.    *
219f0 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20  *.    ** One is 
21a00 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74  tempted to try t
21a10 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f  o add a and b to
21a20 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d   combine the lim
21a30 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20  its.  But this. 
21a40 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77     ** does not w
21a50 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69  ork if either li
21a60 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
21a70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21a80 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
21a90 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
21aa0 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
21ab0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62  imit;.      pSub
21ac0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
21ad0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
21ae0 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
21af0 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
21b00 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
21b10 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
21b20 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
21b30 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
21b40 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66  db, pSub1);..#if
21b50 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
21b60 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
21b70 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
21b80 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x100 ){.    SEL
21b90 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
21ba0 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
21bb0 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29  flattening:\n"))
21bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
21bd0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
21be0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
21bf0 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
21c00 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
21c10 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
21c20 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
21c30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21c40 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66  _VIEW) */....#if
21c50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
21c60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
21c70 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
21c80 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
21c90 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  .** Make copies 
21ca0 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52  of relevant WHER
21cb0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
21cc0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
21cd0 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48  y into.** the WH
21ce0 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ERE clause of su
21cf0 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65  bquery.  Example
21d00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
21d10 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
21d20 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
21d30 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  y FROM t1) WHERE
21d40 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a   x=5 AND y=10;.*
21d50 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64  *.** Transformed
21d60 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   into:.**.**    
21d70 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
21d80 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d  ELECT a AS x, c-
21d90 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57  d AS y FROM t1 W
21da0 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64  HERE a=5 AND c-d
21db0 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52  =10).**     WHER
21dc0 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
21dd0 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69  **.** The hope i
21de0 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  s that the terms
21df0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
21e00 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d  ner query will m
21e10 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65  ake it more.** e
21e20 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
21e30 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
21e40 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
21e50 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29   if:.**.**   (1)
21e60 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
21e70 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
21e80 2e 20 20 28 49 6e 20 74 68 61 74 20 63 61 73 65  .  (In that case
21e90 2c 20 77 65 27 64 20 72 65 61 6c 6c 79 20 77 61  , we'd really wa
21ea0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 63  nt.**       to c
21eb0 6f 70 79 20 74 68 65 20 6f 75 74 65 72 20 57 48  opy the outer WH
21ec0 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE-clause terms
21ed0 20 6f 6e 74 6f 20 74 68 65 20 48 41 56 49 4e 47   onto the HAVING
21ee0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 0a 2a   clause of the.*
21ef0 2a 20 20 20 20 20 20 20 69 6e 6e 65 72 20 71 75  *       inner qu
21f00 65 72 79 2e 20 20 42 75 74 20 74 68 65 79 20 70  ery.  But they p
21f10 72 6f 62 61 62 6c 79 20 77 6f 6e 27 74 20 68 65  robably won't he
21f20 6c 70 20 74 68 65 72 65 20 73 6f 20 64 6f 20 6e  lp there so do n
21f30 6f 74 20 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a  ot bother.).**.*
21f40 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65  *   (2) The inne
21f50 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
21f60 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66  ecursive part of
21f70 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20   a common table 
21f80 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
21f90 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65  *   (3) The inne
21fa0 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49  r query has a LI
21fb0 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63  MIT clause (sinc
21fc0 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  e the changes to
21fd0 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20   the WHERE.**   
21fe0 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20      close would 
21ff0 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69  change the meani
22000 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29  ng of the LIMIT)
22010 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68  ..**.**   (4) Th
22020 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
22030 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
22040 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
22050 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c 65 72 0a  N.  (The caller.
22060 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f 72 63 65  **       enforce
22070 73 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  s this restricti
22080 6f 6e 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f  on since this ro
22090 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68  utine does not h
220a0 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20  ave enough.**   
220b0 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20      information 
220c0 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20  to know.).**.** 
220d0 20 20 28 35 29 20 54 68 65 20 57 48 45 52 45 20    (5) The WHERE 
220e0 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
220f0 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20  n originates in 
22100 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
22110 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
22120 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  of a LEFT JOIN..
22130 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  **.** Return 0 i
22140 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  f no changes are
22150 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65   made and non-ze
22160 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ro if one or mor
22170 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
22180 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c  * terms are dupl
22190 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20  icated into the 
221a0 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
221b0 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e  tic int pushDown
221c0 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61  WhereTerms(.  Pa
221d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
221e0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
221f0 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63  text (for malloc
22200 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70  () and error rep
22210 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c  orting) */.  Sel
22220 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20  ect *pSubq,     
22230 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
22240 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63  ry whose WHERE c
22250 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61  lause is to be a
22260 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78  ugmented */.  Ex
22270 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
22280 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
22290 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
222a0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
222b0 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20 20  int iCursor     
222c0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
222d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75  number of the su
222e0 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45  bquery */.){.  E
222f0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
22300 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 53 65   nChng = 0;.  Se
22310 6c 65 63 74 20 2a 70 58 3b 20 20 20 20 20 20 20  lect *pX;       
22320 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
22330 6e 67 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64  ng over compound
22340 20 53 45 4c 45 43 54 73 20 69 6e 20 70 53 75 62   SELECTs in pSub
22350 71 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72  q */.  if( pWher
22360 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
22370 0a 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b  .  for(pX=pSubq;
22380 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69   pX; pX=pX->pPri
22390 6f 72 29 7b 0a 20 20 20 20 69 66 28 20 28 70 58  or){.    if( (pX
223a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
223b0 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52 65  _Aggregate|SF_Re
223c0 63 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b 0a  cursive))!=0 ){.
223d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
223e0 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  pX->selFlags & S
223f0 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
22400 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
22410 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  X->selFlags & SF
22420 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20  _Recursive );.  
22430 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
22440 21 3d 70 53 75 62 71 20 29 3b 0a 20 20 20 20 20  !=pSubq );.     
22450 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
22460 73 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20 61  strictions (1) a
22470 6e 64 20 28 32 29 20 2a 2f 0a 20 20 20 20 7d 0a  nd (2) */.    }.
22480 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d    }.  if( pSubq-
22490 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20  >pLimit!=0 ){.  
224a0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
224b0 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a  estriction (3) *
224c0 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  /.  }.  while( p
224d0 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  Where->op==TK_AN
224e0 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b  D ){.    nChng +
224f0 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  = pushDownWhereT
22500 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75  erms(pParse, pSu
22510 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67  bq, pWhere->pRig
22520 68 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht, iCursor);.  
22530 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72    pWhere = pWher
22540 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  e->pLeft;.  }.  
22550 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
22560 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72  rty(pWhere,EP_Fr
22570 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
22580 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
22590 6f 6e 20 35 20 2a 2f 0a 20 20 69 66 28 20 73 71  on 5 */.  if( sq
225a0 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
225b0 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c  Constant(pWhere,
225c0 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20   iCursor) ){.   
225d0 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68   nChng++;.    wh
225e0 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20  ile( pSubq ){.  
225f0 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74      SubstContext
22600 20 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   x;.      pNew =
22610 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
22620 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65  pParse->db, pWhe
22630 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 78 2e  re, 0);.      x.
22640 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
22650 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20  .      x.iTable 
22660 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = iCursor;.     
22670 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69   x.iNewTable = i
22680 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e  Cursor;.      x.
22690 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a  isLeftJoin = 0;.
226a0 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d        x.pEList =
226b0 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a   pSubq->pEList;.
226c0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62        pNew = sub
226d0 73 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29  stExpr(&x, pNew)
226e0 3b 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70  ;.      pSubq->p
226f0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
22700 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
22710 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65  b, pSubq->pWhere
22720 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  , pNew);.      p
22730 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50  Subq = pSubq->pP
22740 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rior;.    }.  }.
22750 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a    return nChng;.
22760 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
22770 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
22780 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
22790 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
227a0 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
227b0 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
227c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
227d0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
227e0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
227f0 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
22800 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
22810 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
22820 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
22830 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
22840 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
22850 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
22860 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
22870 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
22880 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
22890 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
228a0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
228b0 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
228c0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
228d0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
228e0 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
228f0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
22900 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
22910 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
22920 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
22930 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
22940 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
22950 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
22960 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
22970 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
22980 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
22990 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
229a0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
229b0 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
229c0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
229d0 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
229e0 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
229f0 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
22a00 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
22a10 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
22a20 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
22a30 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
22a40 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
22a50 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
22a60 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
22a70 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
22a80 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
22a90 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
22aa0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
22ab0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
22ac0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
22ad0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
22ae0 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
22af0 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
22b00 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
22b10 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
22b20 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
22b30 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
22b40 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
22b50 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
22b60 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
22b70 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
22b80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
22b90 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
22ba0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
22bb0 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
22bc0 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
22bd0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
22be0 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
22bf0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
22c00 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
22c10 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
22c20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
22c30 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
22c40 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
22c50 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
22c60 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
22c70 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
22c80 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
22c90 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
22ca0 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
22cb0 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
22cc0 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
22cd0 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
22ce0 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
22cf0 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
22d00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
22d10 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
22d20 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
22d30 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
22d40 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
22d50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
22d60 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
22d70 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
22d80 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
22d90 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
22da0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
22db0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61  rgument is the a
22dc0 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
22dd0 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
22de0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
22df0 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
22e00 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
22e10 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
22e20 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
22e30 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
22e40 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
22e50 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
22e60 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
22e70 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
22e80 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
22e90 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
22ea0 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
22eb0 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
22ec0 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
22ed0 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
22ee0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
22ef0 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
22f00 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
22f10 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
22f20 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
22f30 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
22f40 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
22f50 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
22f60 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
22f70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
22f80 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
22f90 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
22fa0 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
22fb0 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
22fc0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
22fd0 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
22fe0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
22ff0 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
23000 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
23010 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
23020 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
23030 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
23040 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
23050 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
23060 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
23070 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
23080 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
23090 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
230a0 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
230b0 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
230c0 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
230d0 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
230e0 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
230f0 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
23100 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
23110 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
23120 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
23130 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
23140 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
23150 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
23160 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
23170 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
23180 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
23190 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
231a0 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
231b0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
231c0 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
231d0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
231e0 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
231f0 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
23200 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
23210 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
23220 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
23230 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
23240 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
23250 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
23260 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
23270 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
23280 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
23290 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
232a0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
232b0 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
232c0 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
232d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
232e0 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
232f0 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
23300 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
23310 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
23320 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
23330 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65  .    char *zInde
23340 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75  xedBy = pFrom->u
23350 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20  1.zIndexedBy;.  
23360 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
23370 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
23380 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
23390 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
233a0 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
233b0 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42  zName, zIndexedB
233c0 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  y); .        pId
233d0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
233e0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
233f0 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
23400 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
23410 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
23420 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65  ex: %s", zIndexe
23430 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dBy, 0);.      p
23440 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
23450 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
23460 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
23470 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
23480 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  om->pIBIndex = p
23490 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
234a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
234b0 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70  *.** Detect comp
234c0 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
234d0 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20  ements that use 
234e0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
234f0 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61  se with .** an a
23500 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
23510 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
23520 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e  *.**    SELECT .
23530 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
23540 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
23550 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e  M t2 ORDER BY ..
23560 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
23570 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77  ** These are rew
23580 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71  ritten as a subq
23590 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  uery:.**.**    S
235a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
235b0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
235c0 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
235d0 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20  .. FROM t2).**  
235e0 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20     ORDER BY ... 
235f0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
23600 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
23610 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
23620 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  ry because the m
23630 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
23640 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  y() routine.** a
23650 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61  bove that genera
23660 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
23670 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
23680 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
23690 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73   BY clause.** us
236a0 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72  es a merge algor
236b0 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72  ithm that requir
236c0 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
236d0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
236e0 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  n the.** result 
236f0 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68  columns as on th
23700 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
23710 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a  e.  See ticket.*
23720 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  * http://www.sql
23730 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
23740 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a  /6709574d2a.**.*
23750 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
23760 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65  ation is only ne
23770 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c  eded for EXCEPT,
23780 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20   INTERSECT, and 
23790 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e  UNION..** The UN
237a0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
237b0 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68   works fine with
237c0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
237d0 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a  rBy() even when.
237e0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c  ** there are COL
237f0 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68  LATE terms in th
23800 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73  e ORDER BY..*/.s
23810 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72  tatic int conver
23820 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
23830 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72  oSubquery(Walker
23840 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
23850 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t *p){.  int i;.
23860 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
23870 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20    Select *pX;.  
23880 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
23890 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
238a0 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73  tem *a;.  SrcLis
238b0 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61  t *pNewSrc;.  Pa
238c0 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54  rse *pParse;.  T
238d0 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69  oken dummy;..  i
238e0 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
238f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
23900 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e  tinue;.  if( p->
23910 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
23920 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
23930 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70  e;.  for(pX=p; p
23940 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b  X && (pX->op==TK
23950 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  _ALL || pX->op==
23960 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70  TK_SELECT); pX=p
23970 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69  X->pPrior){}.  i
23980 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72  f( pX==0 ) retur
23990 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
239a0 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42    a = p->pOrderB
239b0 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  y->a;.  for(i=p-
239c0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
239d0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
239e0 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78      if( a[i].pEx
239f0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  pr->flags & EP_C
23a00 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a  ollate ) break;.
23a10 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20    }.  if( i<0 ) 
23a20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23a30 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  nue;..  /* If we
23a40 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
23a50 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
23a60 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
23a70 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
23a80 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ..  pParse = pWa
23a90 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
23aa0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
23ab0 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
23ac0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
23ad0 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
23ae0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
23af0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
23b00 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ort;.  memset(&d
23b10 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ummy, 0, sizeof(
23b20 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53  dummy));.  pNewS
23b30 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
23b40 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
23b50 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26  m(pParse,0,0,0,&
23b60 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b  dummy,pNew,0,0);
23b70 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d  .  if( pNewSrc==
23b80 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
23b90 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20  bort;.  *pNew = 
23ba0 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20  *p;.  p->pSrc = 
23bb0 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45  pNewSrc;.  p->pE
23bc0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
23bd0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
23be0 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
23bf0 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52  xpr(db, TK_ASTER
23c00 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f  ISK, 0));.  p->o
23c10 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
23c20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a   p->pWhere = 0;.
23c30 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
23c40 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48   = 0;.  pNew->pH
23c50 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65  aving = 0;.  pNe
23c60 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  w->pOrderBy = 0;
23c70 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
23c80 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30  ;.  p->pNext = 0
23c90 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30  ;.  p->pWith = 0
23ca0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
23cb0 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
23cc0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
23cd0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e  elFlags & SF_Con
23ce0 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20  verted)==0 );.  
23cf0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
23d00 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61  F_Converted;.  a
23d10 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72  ssert( pNew->pPr
23d20 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  ior!=0 );.  pNew
23d30 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ->pPrior->pNext 
23d40 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
23d50 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  pLimit = 0;.  pN
23d60 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b  ew->pOffset = 0;
23d70 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
23d80 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
23d90 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23da0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23db0 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20   term pFrom has 
23dc0 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
23dd0 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e  ction.** argumen
23de0 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ts.  If it does,
23df0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
23e00 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
23e10 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  e and return.** 
23e20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20  non-zero, since 
23e30 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c  pFrom is not all
23e40 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62  owed to be a tab
23e50 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
23e60 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
23e70 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  t cannotBeFuncti
23e80 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
23e90 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
23ea0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
23eb0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
23ec0 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
23ed0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23ee0 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73  pParse, "'%s' is
23ef0 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22   not a function"
23f00 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pFrom->zName);
23f10 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
23f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
23f30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23f40 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
23f50 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28  Argument pWith (
23f60 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c  which may be NUL
23f70 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c  L) points to a l
23f80 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65  inked list of ne
23f90 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f  sted .** WITH co
23fa0 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e  ntexts, from inn
23fb0 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e  er to outermost.
23fc0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64   If the table id
23fd0 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  entified by .** 
23fe0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
23ff0 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61  ent pItem is rea
24000 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62  lly a common-tab
24010 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43  le-expression (C
24020 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74  TE) .** then ret
24030 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24040 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74   the CTE definit
24050 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62  ion for that tab
24060 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  le. Otherwise.**
24070 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
24080 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c  .** If a non-NUL
24090 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  L value is retur
240a0 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74  ned, set *ppCont
240b0 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ext to point to 
240c0 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65  the With.** obje
240d0 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ct that the retu
240e0 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73  rned CTE belongs
240f0 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73   to..*/.static s
24100 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63  truct Cte *searc
24110 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70  hWith(.  With *p
24120 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
24130 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
24140 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49  ent innermost WI
24150 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  TH clause */.  s
24160 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24170 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f  em *pItem,     /
24180 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
24190 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65  ement to resolve
241a0 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43   */.  With **ppC
241b0 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20  ontext          
241c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49        /* OUT: WI
241d0 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  TH clause return
241e0 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74   value belongs t
241f0 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  o */.){.  const 
24200 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
24210 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
24220 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65  ase==0 && (zName
24230 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29   = pItem->zName)
24240 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  !=0 ){.    With 
24250 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57  *p;.    for(p=pW
24260 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75  ith; p; p=p->pOu
24270 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ter){.      int 
24280 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
24290 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b  ; i<p->nCte; i++
242a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
242b0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
242c0 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  ame, p->a[i].zNa
242d0 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
242e0 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d      *ppContext =
242f0 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   p;.          re
24300 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  turn &p->a[i];. 
24310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24320 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24330 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn 0;.}../* The
24340 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
24350 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63  maintains a stac
24360 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48  k of active WITH
24370 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68   clauses.** with
24380 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
24390 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e  WITH clause bein
243a0 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  g at the top of 
243b0 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
243c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
243d0 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c  shes the WITH cl
243e0 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74  ause passed as t
243f0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
24400 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74  nt.** onto the t
24410 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
24420 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72   If argument bFr
24430 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ee is true, then
24440 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c   this.** WITH cl
24450 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  ause will never 
24460 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  be popped from t
24470 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69  he stack. In thi
24480 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f  s case it.** sho
24490 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f  uld be freed alo
244a0 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73  ng with the Pars
244b0 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68  e object. In oth
244c0 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a  er cases, when.*
244d0 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20  * bFree==0, the 
244e0 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c  With object will
244f0 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
24500 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20  with the SELECT 
24510 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69  .** statement wi
24520 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61  th which it is a
24530 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f  ssociated..*/.vo
24540 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  id sqlite3WithPu
24550 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
24560 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75  , With *pWith, u
24570 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65  8 bFree){.  asse
24580 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20  rt( bFree==0 || 
24590 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d  (pParse->pWith==
245a0 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69  0 && pParse->pWi
245b0 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a  thToFree==0) );.
245c0 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
245d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
245e0 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20  e->pWith!=pWith 
245f0 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f  );.    pWith->pO
24600 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70  uter = pParse->p
24610 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
24620 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
24630 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
24640 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f   pParse->pWithTo
24650 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20  Free = pWith;.  
24660 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
24670 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
24680 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f  if argument pFro
24690 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54  m refers to a CT
246a0 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a  E declared by .*
246b0 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20  * a WITH clause 
246c0 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72  on the stack cur
246d0 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65  rently maintaine
246e0 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
246f0 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72   And,.** if curr
24700 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
24710 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f   a CTE expressio
24720 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  n, if it is a re
24730 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72  cursive.** refer
24740 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72  ence to the curr
24750 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49  ent CTE..**.** I
24760 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e  f pFrom falls in
24770 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  to either of the
24780 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20   two categories 
24790 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54  above, pFrom->pT
247a0 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  ab.** and other 
247b0 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c  fields are popul
247c0 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
247d0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  . The caller sho
247e0 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46  uld check.** (pF
247f0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f  rom->pTab!=0) to
24800 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
24810 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63  er or not a succ
24820 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20  essful match.** 
24830 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  was found..**.**
24840 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
24850 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
24860 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
24870 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
24880 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49  ror.** occurs. I
24890 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
248a0 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20  occur, an error 
248b0 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65  message is store
248c0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73  d in the.** pars
248d0 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f  er and some erro
248e0 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
248f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  n SQLITE_OK retu
24900 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
24910 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a  int withExpand(.
24920 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65    Walker *pWalke
24930 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63  r, .  struct Src
24940 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
24950 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
24960 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
24970 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
24980 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
24990 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20  b;.  struct Cte 
249a0 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20  *pCte;          
249b0 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20       /* Matched 
249c0 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20  CTE (or NULL if 
249d0 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57  no match) */.  W
249e0 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20  ith *pWith;     
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a00 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68  * WITH clause th
24a10 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20  at pCte belongs 
24a20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
24a30 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
24a40 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61  );..  pCte = sea
24a50 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e  rchWith(pParse->
24a60 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70  pWith, pFrom, &p
24a70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74  With);.  if( pCt
24a80 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  e ){.    Table *
24a90 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69  pTab;.    ExprLi
24aa0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
24ab0 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
24ac0 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b    Select *pLeft;
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  /* Left-most SEL
24af0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
24b00 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63  .    int bMayRec
24b10 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20  ursive;         
24b20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
24b30 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79  mpound joined by
24b40 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a   UNION [ALL] */.
24b50 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64      With *pSaved
24b60 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
24b70 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
24b80 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57  ue of pParse->pW
24b90 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ith */..    /* I
24ba0 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  f pCte->zCteErr 
24bb0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74  is non-NULL at t
24bc0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
24bd0 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67  this is an illeg
24be0 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73  al.    ** recurs
24bf0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ive reference to
24c00 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65   CTE pCte. Leave
24c10 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
24c20 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  rse and return. 
24c30 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20     ** early. If 
24c40 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73  pCte->zCteErr is
24c50 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
24c60 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
24c70 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20  ive reference.. 
24c80 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
24c90 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f  se, proceed.  */
24ca0 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a  .    if( pCte->z
24cb0 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20  CteErr ){.      
24cc0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24cd0 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43  pParse, pCte->zC
24ce0 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61  teErr, pCte->zNa
24cf0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
24d00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
24d10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61      }.    if( ca
24d20 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70  nnotBeFunction(p
24d30 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20  Parse, pFrom) ) 
24d40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24d50 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ROR;..    assert
24d60 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
24d70 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70   );.    pFrom->p
24d80 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
24d90 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
24da0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
24db0 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  e));.    if( pTa
24dc0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
24dd0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61  C_Abort;.    pTa
24de0 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
24df0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
24e00 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
24e10 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  p(db, pCte->zNam
24e20 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50  e);.    pTab->iP
24e30 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54  Key = -1;.    pT
24e40 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
24e50 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
24e60 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
24e70 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20  (1048576) );.   
24e80 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
24e90 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20  |= TF_Ephemeral 
24ea0 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f  | TF_NoVisibleRo
24eb0 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  wid;.    pFrom->
24ec0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
24ed0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
24ee0 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Cte->pSelect, 0)
24ef0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
24f00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
24f10 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
24f20 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
24f30 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
24f40 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  t );..    /* Che
24f50 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ck if this is a 
24f60 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a  recursive CTE. *
24f70 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72  /.    pSel = pFr
24f80 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
24f90 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d   bMayRecursive =
24fa0 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f   ( pSel->op==TK_
24fb0 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d  ALL || pSel->op=
24fc0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
24fd0 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
24fe0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ve ){.      int 
24ff0 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74  i;.      SrcList
25000 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e   *pSrc = pFrom->
25010 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
25020 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
25030 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
25040 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
25050 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25060 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Item = &pSrc->a[
25070 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
25080 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
25090 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
250a0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
250b0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d   .         && 0=
250c0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
250d0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43  pItem->zName, pC
250e0 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20  te->zName).     
250f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
25100 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20    pItem->pTab = 
25110 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
25120 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pItem->fg.isRecu
25130 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20  rsive = 1;.     
25140 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
25150 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
25160 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSel->selFlags |
25170 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a  = SF_Recursive;.
25180 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25190 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
251a0 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69  Only one recursi
251b0 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ve reference is 
251c0 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20  permitted. */ . 
251d0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61     if( pTab->nTa
251e0 62 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20  bRef>2 ){.      
251f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25200 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
25210 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66  e, "multiple ref
25220 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72  erences to recur
25230 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c  sive table: %s",
25240 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pCte->zName.   
25250 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75     );.      retu
25260 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
25270 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
25280 74 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  t( pTab->nTabRef
25290 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73  ==1 || ((pSel->s
252a0 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72  elFlags&SF_Recur
252b0 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e  sive) && pTab->n
252c0 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20  TabRef==2 ));.. 
252d0 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
252e0 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
252f0 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
25300 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
25310 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
25320 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
25330 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20   pWith;.    if( 
25340 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
25350 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
25360 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50  Prior = pSel->pP
25370 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65  rior;.      asse
25380 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74  rt( pPrior->pWit
25390 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
253a0 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53  rior->pWith = pS
253b0 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20  el->pWith;.     
253c0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
253d0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69  ct(pWalker, pPri
253e0 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  or);.      pPrio
253f0 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20  r->pWith = 0;.  
25400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
25410 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
25420 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
25430 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
25440 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
25450 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74  ;..    for(pLeft
25460 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50  =pSel; pLeft->pP
25470 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66  rior; pLeft=pLef
25480 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  t->pPrior);.    
25490 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e  pEList = pLeft->
254a0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
254b0 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20  pCte->pCols ){. 
254c0 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20       if( pEList 
254d0 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
254e0 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  !=pCte->pCols->n
254f0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
25500 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25510 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
25520 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20  s has %d values 
25530 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
25540 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74  .            pCt
25550 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74  e->zName, pEList
25560 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70  ->nExpr, pCte->p
25570 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20  Cols->nExpr.    
25580 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
25590 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
255a0 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20  SavedWith;.     
255b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
255c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
255d0 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
255e0 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20  Cte->pCols;.    
255f0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  }..    sqlite3Co
25600 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
25610 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
25620 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
25630 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
25640 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
25650 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
25660 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
25670 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
25680 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
25690 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70  CteErr = "multip
256a0 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  le recursive ref
256b0 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20  erences: %s";.  
256c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
256d0 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
256e0 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65   = "recursive re
256f0 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62  ference in a sub
25700 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20  query: %s";.    
25710 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
25720 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
25730 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
25740 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  }.    pCte->zCte
25750 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Err = 0;.    pPa
25760 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
25770 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20  vedWith;.  }..  
25780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25790 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
257a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
257b0 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CTE./*.** If the
257c0 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61   SELECT passed a
257d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
257e0 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73  ument has an ass
257f0 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a  ociated WITH .**
25800 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20   clause, pop it 
25810 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73  from the stack s
25820 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
25830 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
25840 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
25850 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
25860 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  s the xSelectCal
25870 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63  lback2() callbac
25880 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53  k by.** sqlite3S
25890 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68  electExpand() wh
258a0 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c  en walking a SEL
258b0 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f  ECT tree to reso
258c0 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  lve table.** nam
258d0 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f  es and other FRO
258e0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
258f0 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
25900 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  id selectPopWith
25910 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
25920 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
25930 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
25940 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
25950 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
25960 57 69 74 68 20 26 26 20 70 2d 3e 70 50 72 69 6f  With && p->pPrio
25970 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68  r==0 ){.    With
25980 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69   *pWith = findRi
25990 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
259a0 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74 68  h;.    if( pWith
259b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
259c0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
259d0 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th==pWith );.   
259e0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
259f0 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72   = pWith->pOuter
25a00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
25a10 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65  lse.#define sele
25a20 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64  ctPopWith 0.#end
25a30 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
25a40 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
25a50 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
25a60 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
25a70 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
25a80 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
25a90 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
25aa0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
25ab0 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
25ac0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
25ad0 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
25ae0 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
25af0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
25b00 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
25b10 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
25b20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
25b30 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
25b40 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
25b50 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
25b60 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
25b70 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
25b80 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
25b90 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
25ba0 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
25bb0 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
25bc0 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
25bd0 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
25be0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
25bf0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
25c00 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
25c10 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
25c20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
25c30 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
25c40 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
25c50 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
25c60 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
25c70 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
25c80 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
25c90 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
25ca0 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
25cb0 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74  g up the persist
25cc0 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
25cd0 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
25ce0 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
25cf0 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
25d00 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
25d10 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d  clause to accomm
25d20 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
25d30 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
25d40 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
25d50 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
25d60 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
25d70 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
25d80 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
25d90 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
25da0 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
25db0 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
25dc0 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
25dd0 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
25de0 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
25df0 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
25e00 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
25e10 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
25e20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
25e30 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
25e40 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
25e50 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
25e60 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
25e70 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
25e80 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
25e90 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
25ea0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
25eb0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
25ec0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
25ed0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
25ee0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
25ef0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
25f00 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
25f10 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
25f20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
25f30 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
25f40 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
25f50 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52  .  Expr *pE, *pR
25f60 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20  ight, *pExpr;.  
25f70 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70  u16 selFlags = p
25f80 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70  ->selFlags;..  p
25f90 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
25fa0 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28  _Expanded;.  if(
25fb0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
25fc0 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
25fd0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
25fe0 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
25ff0 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46  Src==0) || (selF
26000 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
26010 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
26020 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
26030 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
26040 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
26050 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
26060 20 20 69 66 28 20 70 2d 3e 70 57 69 74 68 20 29    if( p->pWith )
26070 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74  {.    sqlite3Wit
26080 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d  hPush(pParse, p-
26090 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a  >pWith, 0);.  }.
260a0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
260b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
260c0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
260d0 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
260e0 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
260f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
26100 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
26110 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
26120 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
26130 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
26140 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
26150 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
26160 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
26170 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
26180 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
26190 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
261a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
261b0 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
261c0 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
261d0 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
261e0 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
261f0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
26200 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
26210 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
26220 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
26230 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
26240 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
26250 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
26260 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
26270 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
26280 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
26290 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72  ursive==0 || pFr
262a0 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20  om->pTab!=0 );. 
262b0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67     if( pFrom->fg
262c0 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63  .isRecursive ) c
262d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
262e0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
262f0 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
26300 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
26310 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e     if( withExpan
26320 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  d(pWalker, pFrom
26330 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
26340 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46  bort;.    if( pF
26350 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65  rom->pTab ) {} e
26360 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
26370 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
26380 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
26390 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
263a0 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
263b0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
263c0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
263d0 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
263e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
263f0 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
26400 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
26410 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
26420 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
26430 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b==0 );.      if
26440 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c  ( sqlite3WalkSel
26450 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
26460 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  l) ) return WRC_
26470 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46 72  Abort;.      pFr
26480 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
26490 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
264a0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
264b0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
264c0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
264d0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
264e0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
264f0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
26500 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
26510 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
26520 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20  "sqlite_sq_%p", 
26530 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
26540 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
26550 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
26560 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
26570 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  }.      sqlite3C
26580 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
26590 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
265a0 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
265b0 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
265c0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
265d0 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Key = -1;.      
265e0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
265f0 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
26600 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
26610 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
26620 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
26630 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
26640 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
26650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
26660 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
26670 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
26680 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
26690 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
266a0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
266b0 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
266c0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
266d0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
266e0 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
266f0 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
26700 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
26710 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26720 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
26730 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20  nTabRef>=0xffff 
26740 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26750 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26760 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
26770 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
26780 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
26790 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
267a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
267b0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
267c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
267d0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
267e0 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
267f0 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
26800 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
26810 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65  Tab) && cannotBe
26820 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
26830 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
26840 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
26850 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ort;.      }.#if
26860 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
26870 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
26880 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
26890 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
268a0 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  E).      if( IsV
268b0 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20  irtual(pTab) || 
268c0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
268d0 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f  .        i16 nCo
268e0 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  l;.        if( s
268f0 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
26900 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
26910 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
26920 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26930 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26940 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
26950 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
26960 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
26970 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
26980 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ab->pSelect, 0);
26990 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
269a0 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46  SelectSetName(pF
269b0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54  rom->pSelect, pT
269c0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
269d0 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d      nCol = pTab-
269e0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
269f0 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  Tab->nCol = -1;.
26a00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
26a10 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
26a20 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
26a30 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  t);.        pTab
26a40 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
26a50 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
26a60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
26a70 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
26a80 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
26a90 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
26aa0 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
26ab0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
26ac0 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
26ad0 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
26ae0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26af0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26b00 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
26b10 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
26b20 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
26b30 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
26b40 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
26b50 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
26b60 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
26b70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
26b80 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26b90 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
26ba0 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
26bb0 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
26bc0 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
26bd0 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
26be0 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
26bf0 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
26c00 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
26c10 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
26c20 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
26c30 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
26c40 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
26c50 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
26c60 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
26c70 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
26c80 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f  ASTERISK operato
26c90 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
26ca0 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
26cb0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  the column.  ** 
26cc0 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  list.  The follo
26cd0 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
26ce0 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
26cf0 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a   TK_ASTERISK.  *
26d00 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  * expressions an
26d10 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e  d expand each on
26d20 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
26d30 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a   all columns in.
26d40 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e    ** all tables.
26d50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
26d60 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
26d70 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
26d80 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
26d90 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
26da0 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
26db0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
26dc0 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
26dd0 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
26de0 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
26df0 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
26e00 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ( pE->op==TK_AST
26e10 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
26e20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
26e30 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
26e40 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
26e50 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
26e60 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
26e70 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
26e80 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
26e90 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
26ea0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
26eb0 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
26ec0 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
26ed0 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
26ee0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
26ef0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
26f00 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
26f10 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
26f20 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
26f30 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
26f40 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
26f50 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
26f60 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
26f70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
26f80 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
26f90 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
26fa0 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
26fb0 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
26fc0 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
26fd0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
26fe0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
26ff0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
27000 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
27010 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
27020 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
27030 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
27040 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
27050 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27070 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
27080 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
27090 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
270a0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
270b0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
270c0 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70       pE = a[k].p
270d0 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67  Expr;.      pRig
270e0 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
270f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27100 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
27110 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
27120 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
27130 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
27140 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
27150 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
27160 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
27170 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
27180 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
27190 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
271a0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
271b0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
271c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
271d0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
271e0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
271f0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
27200 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
27210 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
27220 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
27230 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
27240 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
27250 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
27260 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
27270 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
27280 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
27290 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
272a0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
272b0 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
272c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
272d0 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
272e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
272f0 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
27300 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
27310 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
27320 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
27330 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
27340 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
27350 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
27360 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
27370 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
27380 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
27390 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
273a0 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
273b0 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
273c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
273d0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
273e0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
273f0 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
27400 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
27410 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
27420 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
27430 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
27440 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
27450 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
27460 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
27470 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
27480 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
27490 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
274a0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
274b0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
274c0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
274d0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
274e0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
274f0 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
27500 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
27510 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
27520 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
27530 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
27540 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
27550 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
27560 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
27570 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
27580 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
27590 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
275a0 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
275b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
275c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
275d0 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
275e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
275f0 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
27600 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
27610 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
27620 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
27630 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27640 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
27650 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
27660 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
27670 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
27680 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
27690 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
276a0 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
276b0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
276c0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
276d0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
276e0 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
276f0 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
27700 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
27710 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
27720 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
27730 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
27740 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
27750 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
27760 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
27770 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
27780 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
27790 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
277a0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
277b0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
277c0 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
277d0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
277e0 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
277f0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
27800 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
27810 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
27820 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
27830 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
27840 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
27850 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
27860 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27870 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
27890 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
278a0 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
278b0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
278c0 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
278d0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
278f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
27900 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
27910 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
27920 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
27930 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
27940 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
27950 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
27960 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
27970 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
27980 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
27990 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
279a0 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
279b0 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
279c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
279d0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
279e0 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
279f0 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
27a00 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
27a10 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
27a20 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
27a30 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
27a40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
27a50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27a60 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
27a70 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
27a80 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
27a90 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
27aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
27ab0 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
27ac0 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
27ad0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
27ae0 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
27af0 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
27b00 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
27b10 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
27b20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
27b30 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
27b40 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
27b50 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
27b60 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
27b70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
27b80 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
27b90 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27bd0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
27be0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
27bf0 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
27c00 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
27c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27c20 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
27c30 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
27c40 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
27c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27c60 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
27c70 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
27c80 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
27c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27ca0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
27cb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27cd0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
27ce0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
27cf0 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
27d00 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
27d10 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
27d20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
27d30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
27d40 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
27d50 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
27d60 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
27d70 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
27d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
27d90 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
27da0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
27db0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
27dc0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
27dd0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
27de0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
27df0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
27e00 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
27e10 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
27e20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
27e30 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
27e40 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
27e50 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
27e60 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
27e70 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
27e80 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
27e90 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  eft, pExpr);.   
27ea0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27eb0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
27ec0 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
27ee0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
27ef0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
27f00 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
27f10 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
27f20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
27f30 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
27f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27f50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27f60 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
27f70 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
27f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27f90 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
27fa0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
27fb0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
27fc0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
27fd0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
27fe0 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
27ff0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
28000 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28010 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
28020 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
28030 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
28040 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
28050 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
28060 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
28070 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28080 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
28090 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
280a0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
280b0 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
280c0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
280d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
280e0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
280f0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
28100 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
28110 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
28130 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
28140 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
28150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28160 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
28170 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
28180 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
28190 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281c0 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
281d0 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
281e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
281f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
28200 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
28210 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28220 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
28230 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
28240 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28250 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28260 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
28270 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
28280 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28290 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
282a0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
282b0 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
282c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
282d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
282e0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
282f0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
28300 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
28310 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28320 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28330 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
28340 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
28350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28360 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28370 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
28380 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
28390 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
283a0 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
283b0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
283c0 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
283d0 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
283e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
283f0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
28400 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
28410 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28420 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
28430 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
28440 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
28450 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
28460 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rt;.  }.#endif. 
28470 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28480 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
28490 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
284a0 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
284b0 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
284c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
284d0 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
284e0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
284f0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
28500 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
28510 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
28520 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
28530 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
28540 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
28550 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
28560 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
28570 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
28580 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
28590 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
285a0 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
285b0 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
285c0 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
285d0 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
285e0 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74  ser tree..*/.int
285f0 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
28600 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
28610 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
28620 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
28630 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
28640 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
28650 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28660 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
28670 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
28680 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
28690 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
286a0 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
286b0 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
286c0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
286d0 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
286e0 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
286f0 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
28700 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
28710 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
28720 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
28730 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
28740 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
28750 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
28760 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
28770 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
28780 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
28790 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
287a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
287b0 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
287c0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
287d0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
287e0 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
287f0 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
28800 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
28810 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
28820 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
28830 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
28840 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
28850 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
28860 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
28870 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
28880 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
28890 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
288a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
288b0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
288c0 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
288d0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
288e0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
288f0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
28900 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
28910 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
28920 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
28930 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
28940 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70   pParse;.  if( p
28950 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
28960 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  nd ){.    w.xSel
28970 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
28980 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
28990 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
289a0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
289b0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
289c0 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65  );.  }.  w.xSele
289d0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
289e0 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77  ectExpander;.  w
289f0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
28a00 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74  2 = selectPopWit
28a10 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  h;.  sqlite3Walk
28a20 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
28a30 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
28a40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
28a50 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
28a60 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
28a70 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
28a80 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
28a90 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
28aa0 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
28ab0 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
28ac0 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
28ad0 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
28ae0 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
28af0 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
28b00 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
28b10 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
28b20 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
28b30 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
28b40 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
28b50 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
28b60 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
28b70 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
28b80 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
28b90 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
28ba0 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
28bb0 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
28bc0 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
28bd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
28be0 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
28bf0 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
28c00 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
28c10 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
28c20 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
28c30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
28c40 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
28c50 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
28c60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
28c70 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
28c80 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20  TypeInfo(Walker 
28c90 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
28ca0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
28cb0 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Parse;.  int i;.
28cc0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
28cd0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
28ce0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
28cf0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  m;..  assert( p-
28d00 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
28d10 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73 73  esolved );.  ass
28d20 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
28d30 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
28d40 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73  fo)==0 );.  p->s
28d50 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
28d60 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61  sTypeInfo;.  pPa
28d70 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
28d80 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73  Parse;.  pTabLis
28d90 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66  t = p->pSrc;.  f
28da0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
28db0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
28dc0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
28dd0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
28de0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
28df0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  rom->pTab;.    a
28e00 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
28e10 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
28e20 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
28e30 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a  phemeral)!=0 ){.
28e40 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
28e50 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
28e60 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
28e70 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  ECT */.      Sel
28e80 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
28e90 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
28ea0 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
28eb0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
28ec0 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
28ed0 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
28ee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28ef0 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
28f00 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
28f10 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
28f20 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
28f30 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
28f40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28f50 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79  tine adds dataty
28f60 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  pe and collating
28f70 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d   sequence inform
28f80 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20  ation to.** the 
28f90 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73  Table structures
28fa0 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   of all FROM-cla
28fb0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69  use subqueries i
28fc0 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  n a.** SELECT st
28fd0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55  atement..**.** U
28fe0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
28ff0 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
29000 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
29010 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
29020 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50  ectAddTypeInfo(P
29030 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
29040 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
29050 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29060 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57  MIT_SUBQUERY.  W
29070 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
29080 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
29090 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  w));.  w.xSelect
290a0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
290b0 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
290c0 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
290d0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
290e0 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
290f0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
29100 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
29110 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
29120 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lect);.#endif.}.
29130 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
29140 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53  tine sets up a S
29150 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
29160 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  for processing. 
29170 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
29180 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65  g is accomplishe
29190 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  d:.**.**     *  
291a0 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62  VDBE Cursor numb
291b0 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64  ers are assigned
291c0 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   to all FROM-cla
291d0 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20  use terms..**   
291e0 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54    *  Ephemeral T
291f0 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65  able objects are
29200 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
29210 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
29220 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20  queries..**     
29230 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  *  ON and USING 
29240 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66  clauses are shif
29250 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73  ted into WHERE s
29260 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20  tatements.**    
29270 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a   *  Wildcards "*
29280 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20  " and "TABLE.*" 
29290 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61  in result sets a
292a0 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20  re expanded..** 
292b0 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65      *  Identifie
292c0 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  rs in expression
292d0 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20   are matched to 
292e0 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
292f0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
29300 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61  recursively on a
29310 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69  ll subqueries wi
29320 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e  thin the SELECT.
29330 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
29340 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61  SelectPrep(.  Pa
29350 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
29360 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
29370 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
29380 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
29390 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
293a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
293b0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
293c0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
293d0 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
293e0 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74  context for cont
293f0 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  ainer */.){.  sq
29400 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
29410 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
29420 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50  eturn;.  db = pP
29430 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
29440 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29450 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
29460 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
29470 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
29480 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
29490 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
294a0 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
294b0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
294c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
294d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
294e0 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
294f0 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
29500 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
29510 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
29520 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
29530 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
29540 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
29550 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
29560 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
29570 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
29580 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
29590 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
295a0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
295b0 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
295c0 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
295d0 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
295e0 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
295f0 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
29600 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
29610 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
29620 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73  ates code that s
29630 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
29640 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
29650 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  ry.** cells..*/.
29660 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
29670 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
29680 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
29690 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
296a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
296b0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
296c0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
296d0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
296e0 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70  ;.  int nReg = p
296f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b  AggInfo->nFunc +
29700 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75   pAggInfo->nColu
29710 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  mn;.  if( nReg==
29720 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  0 ) return;.#ifd
29730 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29740 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
29750 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67   all AggInfo reg
29760 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69  isters are withi
29770 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63  n the range spec
29780 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67  ified by.  ** Ag
29790 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67  gInfo.mnReg..Agg
297a0 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20  Info.mxReg */.  
297b0 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41  assert( nReg==pA
297c0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41  ggInfo->mxReg-pA
297d0 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20  ggInfo->mnReg+1 
297e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
297f0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
29800 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  n; i++){.    ass
29810 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
29820 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  Col[i].iMem>=pAg
29830 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
29840 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
29850 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c  o->aCol[i].iMem<
29860 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
29870 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   );.  }.  for(i=
29880 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
29890 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
298a0 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
298b0 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e  ->aFunc[i].iMem>
298c0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
298d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
298e0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
298f0 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
29900 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e  mxReg );.  }.#en
29910 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dif.  sqlite3Vdb
29920 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
29930 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
29940 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f  >mnReg, pAggInfo
29950 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28  ->mxReg);.  for(
29960 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
29970 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
29980 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
29990 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
299a0 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
299b0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
299c0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
299d0 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
299e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
299f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
29a00 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
29a10 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
29a20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
29a30 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
29a40 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
29a50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
29a60 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
29a70 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
29a80 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
29a90 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
29aa0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
29ab0 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
29ac0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
29ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
29ae0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
29af0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
29b00 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
29b10 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29  ->x.pList, 0, 0)
29b20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29b30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
29b40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
29b50 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
29b60 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
29b90 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
29ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29bb0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
29bc0 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
29bd0 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
29be0 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
29bf0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
29c00 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
29c10 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
29c20 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
29c30 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
29c40 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
29c50 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
29c60 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
29c70 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
29c80 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
29c90 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
29ca0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
29cb0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
29cc0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
29cd0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
29ce0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
29cf0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
29d00 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
29d10 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29d20 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
29d30 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
29d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29d50 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op2(v, OP_AggFin
29d60 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
29d70 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
29d80 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c  pr : 0);.    sql
29d90 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
29da0 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50  (v, pF->pFunc, P
29db0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
29dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
29dd0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
29de0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
29df0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
29e00 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
29e10 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
29e20 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
29e30 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
29e40 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
29e50 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
29e60 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
29e70 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
29e80 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
29e90 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b   int regHit = 0;
29ea0 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65  .  int addrHitTe
29eb0 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
29ec0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
29ed0 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
29ee0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
29ef0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
29f00 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
29f10 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
29f20 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
29f30 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
29f40 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
29f50 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
29f60 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
29f70 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
29f80 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
29f90 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
29fa0 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
29fb0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
29fc0 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
29fd0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
29fe0 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
29ff0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
2a000 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
2a010 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
2a020 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
2a030 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
2a040 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2a050 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2a060 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
2a070 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  , 0, SQLITE_ECEL
2a080 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
2a090 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
2a0a0 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
2a0b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
2a0c0 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
2a0d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
2a0e0 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
2a0f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2a100 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2a110 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45  nArg==0 );  /* E
2a120 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
2a130 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
2a140 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a  ( nArg>1 );   /*
2a150 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a   Also an error *
2a160 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  /.      codeDist
2a170 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
2a180 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
2a190 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
2a1a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a1b0 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  pF->pFunc->funcF
2a1c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2a1d0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
2a1e0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2a1f0 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
2a200 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2a210 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
2a220 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
2a230 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
2a240 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
2a250 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
2a260 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
2a270 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
2a280 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
2a290 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
2a2a0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2a2b0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2a2c0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2a2d0 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
2a2e0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
2a2f0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2a300 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
2a310 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
2a320 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2a330 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48  }.      if( regH
2a340 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66  it==0 && pAggInf
2a350 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
2a360 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61  ) regHit = ++pPa
2a370 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2a380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a390 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
2a3a0 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20  , regHit, 0, 0, 
2a3b0 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
2a3c0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
2a3d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
2a3e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67  eAddOp3(v, OP_Ag
2a3f0 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67  gStep0, 0, regAg
2a400 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20  g, pF->iMem);.  
2a410 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
2a420 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
2a430 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
2a440 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a450 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
2a460 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
2a470 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
2a480 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
2a490 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
2a4a0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2a4b0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
2a4c0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2a4d0 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
2a4e0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
2a4f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2a500 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
2a510 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2a520 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2a530 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
2a540 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
2a550 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61  populating the a
2a560 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
2a570 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ters, clear the 
2a580 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
2a590 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
2a5a0 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75   any of the requ
2a5b0 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ired column valu
2a5c0 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  es are already p
2a5d0 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20  resent .  ** in 
2a5e0 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74  registers, sqlit
2a5f0 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79  e3ExprCode() may
2a600 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f   use OP_SCopy to
2a610 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a   copy the value.
2a620 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d    ** to pC->iMem
2a630 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d  . But by the tim
2a640 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75  e the value is u
2a650 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  sed, the origina
2a660 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20  l register.  ** 
2a670 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73  may have been us
2a680 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  ed, invalidating
2a690 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
2a6a0 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74  buffer holding t
2a6b0 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20  he.  ** text or 
2a6c0 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20  blob value. See 
2a6d0 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63  ticket [883034dc
2a6e0 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  b5]..  **.  ** A
2a6f0 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20  nother solution 
2a700 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e  would be to chan
2a710 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20  ge the OP_SCopy 
2a720 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63  used to copy cac
2a730 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  hed.  ** values 
2a740 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20  to an OP_Copy.. 
2a750 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74   */.  if( regHit
2a760 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54   ){.    addrHitT
2a770 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
2a780 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
2a790 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43  , regHit); VdbeC
2a7a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
2a7b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2a7c0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2a7d0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
2a7e0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
2a7f0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
2a800 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
2a810 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
2a820 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2a830 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
2a840 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
2a850 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
2a860 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
2a870 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2a880 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64  Parse);.  if( ad
2a890 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
2a8a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2a8b0 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
2a8c0 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
2a8d0 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
2a8e0 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
2a8f0 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
2a900 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
2a910 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
2a920 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
2a930 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2a940 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
2a950 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2a960 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
2a970 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
2a980 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
2a990 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2a9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2a9b0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
2a9c0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
2a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a9e0 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
2a9f0 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
2aa00 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
2aa10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2aa20 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
2aa30 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
2aa40 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
2aa50 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
2aa60 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f  2 ){.    int bCo
2aa70 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26  ver = (pIdx!=0 &
2aa80 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
2aa90 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
2aaa0 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b  eyIndex(pIdx)));
2aab0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20  .    char *zEqp 
2aac0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
2aad0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43  (pParse->db, "SC
2aae0 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22  AN TABLE %s%s%s"
2aaf0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
2ab00 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62  zName,.        b
2ab10 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20  Cover ? " USING 
2ab20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22  COVERING INDEX "
2ab30 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62   : "",.        b
2ab40 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e  Cover ? pIdx->zN
2ab50 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a  ame : "".    );.
2ab60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ab70 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70  ddOp4(.        p
2ab80 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
2ab90 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
2aba0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
2abb0 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41  0, zEqp, P4_DYNA
2abc0 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  MIC.    );.  }.}
2abd0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2abe0 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
2abf0 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  nt(a,b,c).#endif
2ac00 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2ac10 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
2ac20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
2ac30 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
2ac40 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
2ac50 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
2ac60 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69  returned accordi
2ac70 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74  ng to the Select
2ac80 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
2ac90 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
2aca0 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66  in sqliteInt.h f
2acb0 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
2acc0 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
2acd0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2ace0 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
2acf0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
2ad00 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
2ad10 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
2ad20 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
2ad30 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2ad40 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
2ad50 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2ad60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ad70 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
2ad80 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
2ad90 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
2ada0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
2adb0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
2adc0 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
2add0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
2ade0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2adf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2ae00 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
2ae10 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
2ae20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ae30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2ae40 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
2ae50 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
2ae60 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
2ae70 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
2ae80 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
2ae90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
2aea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2aeb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2aec0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
2aed0 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
2aee0 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
2aef0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
2af00 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
2af10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2af20 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
2af30 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
2af40 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
2af50 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
2af60 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
2af70 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
2af80 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
2af90 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
2afa0 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  = 0;  /* List of
2afb0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
2afc0 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
2afd0 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
2afe0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
2aff0 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
2b000 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
2b010 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
2b020 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2b030 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2b040 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2b050 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
2b060 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
2b070 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
2b080 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
2b090 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
2b0a0 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
2b0b0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2b0c0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
2b0d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2b0e0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
2b0f0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
2b100 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
2b110 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
2b120 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
2b130 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
2b140 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53  T keyword */.  S
2b150 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20  ortCtx sSort;   
2b160 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e        /* Info on
2b170 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
2b180 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2b190 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
2b1a0 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
2b1b0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
2b1c0 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
2b1d0 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
2b1e0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
2b1f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2b200 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
2b210 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
2b220 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2b230 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2b240 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
2b250 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b260 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
2b270 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  t iRestoreSelect
2b280 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
2b290 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65  lectId;.  pParse
2b2a0 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50  ->iSelectId = pP
2b2b0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2b2c0 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  tId++;.#endif.. 
2b2d0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2b2e0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
2b2f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b300 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
2b310 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2b320 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2b330 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2b340 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
2b350 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
2b360 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
2b370 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
2b380 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
2b390 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2b3a0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61  CE_ENABLED.  pPa
2b3b0 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
2b3c0 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52  nt++;.  SELECTTR
2b3d0 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20  ACE(1,pParse,p, 
2b3e0 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69  ("begin processi
2b3f0 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20  ng:\n"));.  if( 
2b400 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2b410 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2b420 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2b430 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2b440 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2b450 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2b460 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2b470 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
2b480 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
2b490 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2b4a0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2b4b0 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  !=SRT_Fifo );.  
2b4c0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2b4d0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2b4e0 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
2b4f0 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72  Queue );.  asser
2b500 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
2b510 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
2b520 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a  t!=SRT_Queue );.
2b530 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
2b540 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
2b550 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
2b560 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
2b570 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
2b580 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
2b590 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
2b5a0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2b5b0 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
2b5c0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2b5d0 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20  card ||.        
2b5e0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
2b5f0 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70  =SRT_Queue  || p
2b600 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2b610 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20  _DistFifo ||.   
2b620 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2b630 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
2b640 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  eue || pDest->eD
2b650 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a  est==SRT_Fifo);.
2b660 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20      /* If ORDER 
2b670 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66  BY makes no diff
2b680 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75  erence in the ou
2b690 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65  tput then neithe
2b6a0 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49  r does.    ** DI
2b6b0 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e  STINCT so it can
2b6c0 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e   be removed too.
2b6d0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
2b6e0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2b6f0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
2b700 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
2b710 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  = 0;.    p->selF
2b720 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
2b730 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
2b740 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
2b750 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d  arse, p, 0);.  m
2b760 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c  emset(&sSort, 0,
2b770 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b   sizeof(sSort));
2b780 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  .  sSort.pOrderB
2b790 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2b7a0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2b7b0 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61  >pSrc;.  if( pPa
2b7c0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
2b7d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
2b7e0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
2b7f0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _end;.  }.  asse
2b800 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
2b810 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70   );.  isAgg = (p
2b820 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2b830 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23  Aggregate)!=0;.#
2b840 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2b850 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2b860 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2b870 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53  & 0x100 ){.    S
2b880 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
2b890 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74  ,pParse,p, ("aft
2b8a0 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
2b8b0 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  on:\n"));.    sq
2b8c0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2b8d0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2b8e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54  }.#endif..  /* T
2b8f0 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ry to flatten su
2b900 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  bqueries in the 
2b910 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69  FROM clause up i
2b920 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65  nto the main que
2b930 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  ry.  */.#if !def
2b940 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2b950 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
2b960 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2b970 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
2b980 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
2b990 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
2b9a0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2b9b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b9c0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
2b9d0 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
2b9e0 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2b9f0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
2ba00 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
2ba10 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2ba20 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
2ba30 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2ba40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
2ba50 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74   /* Catch mismat
2ba60 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72  ch in the declar
2ba70 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20  ed columns of a 
2ba80 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d  view and the num
2ba90 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f  ber of.    ** co
2baa0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  lumns in the SEL
2bab0 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a  ECT on the RHS *
2bac0 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  /.    if( pTab->
2bad0 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69  nCol!=pSub->pELi
2bae0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
2baf0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2bb00 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65  sg(pParse, "expe
2bb10 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
2bb20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74  for '%s' but got
2bb30 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
2bb40 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
2bb50 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e  ->nCol, pTab->zN
2bb60 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ame, pSub->pELis
2bb70 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
2bb80 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2bb90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 41  ;.    }..    isA
2bba0 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73  ggSub = (pSub->s
2bbb0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2bbc0 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20  regate)!=0;.    
2bbd0 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
2bbe0 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
2bbf0 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75  , isAgg, isAggSu
2bc00 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
2bc10 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
2bc20 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
2bc30 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
2bc40 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
2bc50 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
2bc60 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
2bc70 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
2bc80 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
2bc90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
2bca0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
2bcb0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2bcc0 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  c;.    if( db->m
2bcd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2bce0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2bcf0 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
2bd00 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2bd10 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  ){.      sSort.p
2bd20 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2bd30 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
2bd40 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
2bd50 74 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20  t a pointer the 
2bd60 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
2bd70 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ruction, allocat
2bd80 69 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69  ing a new VDBE i
2bd90 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20  f one.  ** does 
2bda0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
2bdb0 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  t */.  v = sqlit
2bdc0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2bdd0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
2bde0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2bdf0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2be00 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2be10 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c  ELECT.  /* Handl
2be20 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
2be30 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  T statements usi
2be40 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ng the separate 
2be50 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20  multiSelect().  
2be60 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20  ** procedure..  
2be70 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
2be80 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
2be90 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
2bea0 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
2beb0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2bec0 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2bed0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2bee0 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45  electId);.#if SE
2bef0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2bf00 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
2bf10 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
2bf20 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
2bf30 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
2bf40 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
2bf50 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
2bf60 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2bf70 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2bf80 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
2bf90 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
2bfa0 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
2bfb0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
2bfc0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2bfd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2bfe0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2bff0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2c000 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  W).  for(i=0; i<
2c010 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2c020 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2c030 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2c040 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2c050 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
2c060 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
2c070 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
2c080 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
2c090 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
2c0a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
2c0b0 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68   /* Sometimes th
2c0c0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62  e code for a sub
2c0d0 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65  query will be ge
2c0e0 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61  nerated more tha
2c0f0 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69  n.    ** once, i
2c100 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2c110 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48  s part of the WH
2c120 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ERE clause in a 
2c130 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a  LEFT JOIN,.    *
2c140 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  * for example.  
2c150 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f  In that case, do
2c160 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20   not regenerate 
2c170 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69  the code to mani
2c180 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69  fest.    ** a vi
2c190 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75  ew or the co-rou
2c1a0 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tine to implemen
2c1b0 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66  t a view.  The f
2c1c0 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20  irst instance.  
2c1d0 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65    ** is sufficie
2c1e0 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73  nt, though the s
2c1f0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e  ubroutine to man
2c200 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64  ifest the view d
2c210 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  oes need.    ** 
2c220 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67  to be invoked ag
2c230 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
2c240 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2c250 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ub ){.      if( 
2c260 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
2c270 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  outine==0 ){.   
2c280 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 72       /* The subr
2c290 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6e 69  outine that mani
2c2a0 66 65 73 74 73 20 74 68 65 20 76 69 65 77 20 6d  fests the view m
2c2b0 69 67 68 74 20 62 65 20 61 20 6f 6e 65 2d 74 69  ight be a one-ti
2c2c0 6d 65 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20  me routine,.    
2c2d0 20 20 20 20 2a 2a 20 6f 72 20 69 74 20 6d 69 67      ** or it mig
2c2e0 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ht need to be re
2c2f0 72 75 6e 20 6f 6e 20 65 61 63 68 20 69 74 65 72  run on each iter
2c300 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 69 74  ation because it
2c310 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 63 6f  .        ** enco
2c320 64 65 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64  des a correlated
2c330 20 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20   subquery. */.  
2c340 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c350 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
2c360 28 76 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  (v, pItem->addrF
2c370 69 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f 64 65 3d  illSub)->opcode=
2c380 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20 20 20 20  =OP_Once );.    
2c390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c3a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2c3b0 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  b, pItem->regRet
2c3c0 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72  urn, pItem->addr
2c3d0 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20  FillSub);.      
2c3e0 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  }.      continue
2c3f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2c400 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e  Increment Parse.
2c410 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68  nHeight by the h
2c420 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72  eight of the lar
2c430 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  gest expression.
2c440 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65      ** tree refe
2c450 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c  rred to by this,
2c460 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65   the parent sele
2c470 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65  ct. The child se
2c480 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20  lect.    ** may 
2c490 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69  contain expressi
2c4a0 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d  on trees of at m
2c4b0 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49  ost.    ** (SQLI
2c4c0 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2c4d0 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29  H-Parse.nHeight)
2c4e0 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73   height. This is
2c4f0 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f   a bit.    ** mo
2c500 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20  re conservative 
2c510 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20  than necessary, 
2c520 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20  but much easier 
2c530 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20  than enforcing. 
2c540 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c     ** an exact l
2c550 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  imit..    */.   
2c560 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
2c570 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   += sqlite3Selec
2c580 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
2c590 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70  .    /* Make cop
2c5a0 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20  ies of constant 
2c5b0 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72  WHERE-clause ter
2c5c0 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ms in the outer 
2c5d0 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a  query down.    *
2c5e0 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75 62  * inside the sub
2c5f0 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e  query.  This can
2c600 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75 65   help the subque
2c610 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65  ry to run more e
2c620 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20  fficiently..    
2c630 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74 65  */.    if( (pIte
2c640 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
2c650 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20   JT_OUTER)==0.  
2c660 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68     && pushDownWh
2c670 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ereTerms(pParse,
2c680 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65   pSub, p->pWhere
2c690 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2c6a0 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c  ).    ){.#if SEL
2c6b0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2c6c0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2c6d0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
2c6e0 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  0x100 ){.       
2c6f0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
2c700 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
2c710 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ter WHERE-clause
2c720 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29   push-down:\n"))
2c730 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2c740 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2c750 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
2c760 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
2c770 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2c780 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
2c790 74 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  t the subquery. 
2c7a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2c7b0 20 73 75 62 71 75 65 72 79 20 69 73 20 69 6d 70   subquery is imp
2c7c0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
2c7d0 2d 72 6f 75 74 69 6e 65 20 69 66 20 61 6c 6c 20  -routine if all 
2c7e0 6f 66 20 74 68 65 73 65 20 61 72 65 20 74 72 75  of these are tru
2c7f0 65 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20  e:.    **   (1) 
2c800 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
2c810 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2c820 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  e the outer loop
2c830 20 28 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20   (so that it.   
2c840 20 2a 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20   **        does 
2c850 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  not need to be c
2c860 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61  omputed more tha
2c870 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 20 20  n once).    **  
2c880 20 28 32 29 20 20 54 68 65 20 41 4c 4c 20 6b 65   (2)  The ALL ke
2c890 79 77 6f 72 64 20 61 66 74 65 72 20 53 45 4c 45  yword after SELE
2c8a0 43 54 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  CT is omitted.  
2c8b0 28 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 61 72  (Applications ar
2c8c0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
2c8d0 61 6c 6c 6f 77 65 64 20 74 6f 20 73 61 79 20 22  allowed to say "
2c8e0 53 45 4c 45 43 54 20 41 4c 4c 22 20 69 6e 73 74  SELECT ALL" inst
2c8f0 65 61 64 20 6f 66 20 6a 75 73 74 20 22 53 45 4c  ead of just "SEL
2c900 45 43 54 22 20 74 6f 20 64 69 73 61 62 6c 65 0a  ECT" to disable.
2c910 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 74 68      **        th
2c920 65 20 75 73 65 20 6f 66 20 63 6f 2d 72 6f 75 74  e use of co-rout
2c930 69 6e 65 73 2e 29 0a 20 20 20 20 2a 2a 20 20 20  ines.).    **   
2c940 28 33 29 20 20 43 6f 2d 72 6f 75 74 69 6e 65 73  (3)  Co-routines
2c950 20 61 72 65 20 6e 6f 74 20 64 69 73 61 62 6c 65   are not disable
2c960 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
2c970 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 20  test_control(). 
2c980 20 20 20 2a 2a 20 20 20 20 20 20 20 20 77 69 74     **        wit
2c990 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  h SQLITE_TESTCTR
2c9a0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2e  L_OPTIMIZATIONS.
2c9b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2c9c0 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f  ODO: Are there o
2c9d0 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73  ther reasons bes
2c9e0 69 64 65 20 28 31 29 20 74 6f 20 75 73 65 20 61  ide (1) to use a
2c9f0 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20   co-routine.    
2ca00 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2ca10 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n?.    */.    if
2ca20 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  ( i==0.     && (
2ca30 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
2ca40 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  1.            ||
2ca50 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d   (pTabList->a[1]
2ca60 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54  .fg.jointype&(JT
2ca70 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
2ca80 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a  !=0)  /* (1) */.
2ca90 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46       && (p->selF
2caa0 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 29 3d 3d  lags & SF_All)==
2cab0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cad0 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
2cae0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2caf0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2cb00 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
2cb10 6e 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ne)             
2cb20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
2cb30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c  ){.      /* Impl
2cb40 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69  ement a co-routi
2cb50 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74  ne that will ret
2cb60 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
2cb70 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
2cb80 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
2cb90 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
2cba0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2cbb0 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  nt addrTop = sql
2cbc0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2cbd0 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 20  ddr(v)+1;.      
2cbe0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2cbf0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2cc00 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
2cc10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2cc20 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
2cc30 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2cc40 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
2cc50 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2cc60 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  ((v, "%s", pItem
2cc70 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
2cc80 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
2cc90 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72  drFillSub = addr
2cca0 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Top;.      sqlit
2ccb0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
2ccc0 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
2ccd0 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
2cce0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2ccf0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2cd00 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
2cd10 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
2cd20 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
2cd30 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2cd40 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
2cd50 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
2cd60 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
2cd70 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e  wLogEst = pSub->
2cd80 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
2cd90 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43    pItem->fg.viaC
2cda0 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20  oroutine = 1;.  
2cdb0 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
2cdc0 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73  sult = dest.iSds
2cdd0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
2cde0 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
2cdf0 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  (v, pItem->regRe
2ce00 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  turn);.      sql
2ce10 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2ce20 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
2ce30 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
2ce40 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
2ce50 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
2ce60 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
2ce70 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
2ce80 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
2ce90 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
2cea0 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
2ceb0 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
2cec0 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
2ced0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2cee0 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
2cef0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
2cf00 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
2cf10 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
2cf20 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
2cf30 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
2cf40 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
2cf50 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
2cf60 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
2cf70 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
2cf80 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
2cf90 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
2cfa0 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
2cfb0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
2cfc0 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
2cfd0 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
2cfe0 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
2cff0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2d000 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
2d010 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
2d020 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2d030 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2d040 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
2d050 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2d060 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2d070 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
2d080 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2d090 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
2d0a0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
2d0b0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
2d0c0 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c  ry is not correl
2d0d0 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61  ated and if we a
2d0e0 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66  re not inside of
2d0f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
2d100 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f  igger, then we o
2d110 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70  nly need to comp
2d120 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ute the value of
2d130 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
2d140 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a        ** once. *
2d150 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64  /.        onceAd
2d160 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2d170 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
2d180 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
2d190 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
2d1a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  eComment((v, "ma
2d1b0 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
2d1c0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2d1d0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
2d1e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64  else{.        Vd
2d1f0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
2d200 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
2d210 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
2d220 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2d230 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2d240 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
2d250 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68  t(&dest, SRT_Eph
2d260 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43  emTab, pItem->iC
2d270 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78  ursor);.      ex
2d280 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2d290 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
2d2a0 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
2d2b0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
2d2c0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2d2d0 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
2d2e0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
2d2f0 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
2d300 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
2d310 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
2d320 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73  if( onceAddr ) s
2d330 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2d340 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b  re(v, onceAddr);
2d350 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d  .      retAddr =
2d360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d370 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2d380 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2d390 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
2d3a0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25  mment((v, "end %
2d3b0 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
2d3c0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2d3d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2d3e0 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20  eP1(v, topAddr, 
2d3f0 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  retAddr);.      
2d400 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2d410 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
2d420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d430 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d440 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2d450 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  nd;.    pParse->
2d460 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
2d470 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
2d480 68 74 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ht(p);.  }.#endi
2d490 66 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  f..  /* Various 
2d4a0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
2d4b0 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e  SELECT copied in
2d4c0 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  to local variabl
2d4d0 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76  es for.  ** conv
2d4e0 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c  enience */.  pEL
2d4f0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
2d500 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
2d510 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
2d520 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
2d530 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
2d540 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
2d550 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
2d560 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2d570 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
2d580 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2d590 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2d5a0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2d5b0 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
2d5c0 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
2d5d0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
2d5e0 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
2d5f0 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
2d600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2d610 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2d620 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2d630 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75  ..  /* If the qu
2d640 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
2d650 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
2d660 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61   but is not an a
2d670 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20  ggregate, and . 
2d680 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63   ** if the selec
2d690 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61  t-list is the sa
2d6a0 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20  me as the ORDER 
2d6b0 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68  BY list, then th
2d6c0 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61  is query.  ** ca
2d6d0 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
2d6e0 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e  s a GROUP BY. In
2d6f0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
2d700 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
2d710 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
2d720 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  T xyz FROM ... O
2d730 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
2d740 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f  .  ** is transfo
2d750 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  rmed to:.  **.  
2d760 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79  **     SELECT xy
2d770 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50  z FROM ... GROUP
2d780 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59   BY xyz ORDER BY
2d790 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   xyz.  **.  ** T
2d7a0 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
2d7b0 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61  s preferred as a
2d7c0 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f   single index (o
2d7d0 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61  r temp-table) ma
2d7e0 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20  y be .  ** used 
2d7f0 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44  for both the ORD
2d800 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ER BY and DISTIN
2d810 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41  CT processing. A
2d820 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20  s originally .  
2d830 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71  ** written the q
2d840 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20  uery must use a 
2d850 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61  temp-table for a
2d860 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
2d870 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42  he ORDER .  ** B
2d880 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20  Y and DISTINCT, 
2d890 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  and an index or 
2d8a0 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61  separate temp-ta
2d8b0 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65  ble for the othe
2d8c0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
2d8d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
2d8e0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
2d8f0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
2d900 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c  tinct .   && sql
2d910 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2d920 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72  are(sSort.pOrder
2d930 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d  By, pEList, -1)=
2d940 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73  =0.  ){.    p->s
2d950 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
2d960 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72  istinct;.    pGr
2d970 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
2d980 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
2d990 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c  rListDup(db, pEL
2d9a0 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  ist, 0);.    /* 
2d9b0 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e  Notice that even
2d9c0 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74   thought SF_Dist
2d9d0 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c  inct has been cl
2d9e0 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65  eared from p->se
2d9f0 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74  lFlags,.    ** t
2da00 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  he sDistinct.isT
2da10 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74  nct is still set
2da20 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74  .  Hence, isTnct
2da30 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a   represents the.
2da40 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20      ** original 
2da50 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53  setting of the S
2da60 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c  F_Distinct flag,
2da70 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74   not the current
2da80 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20   setting */.    
2da90 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63  assert( sDistinc
2daa0 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66  t.isTnct );..#if
2dab0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2dac0 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
2dad0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
2dae0 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20  & 0x400 ){.     
2daf0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
2db00 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72  00,pParse,p,("Tr
2db10 61 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54  ansform DISTINCT
2db20 20 69 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c   into GROUP BY:\
2db30 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n"));.      sqli
2db40 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2db50 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
2db60 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
2db70 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
2db80 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2db90 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e, then create a
2dba0 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
2dbb0 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65  x to.  ** do the
2dbc0 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74   sorting.  But t
2dbd0 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65  his sorting ephe
2dbe0 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68  meral index migh
2dbf0 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65  t end up.  ** be
2dc00 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
2dc10 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 65 78  e data can be ex
2dc20 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
2dc30 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a  orted order..  *
2dc40 2a 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65  * If that is the
2dc50 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
2dc60 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2dc70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
2dc80 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65  l be.  ** change
2dc90 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
2dca0 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65 20 6f  once we figure o
2dcb0 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
2dcc0 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a  ing index is.  *
2dcd0 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  * not needed.  T
2dce0 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  he sSort.addrSor
2dcf0 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20  tIndex variable 
2dd00 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
2dd10 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20  itate.  ** that 
2dd20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
2dd30 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
2dd40 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
2dd50 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
2dd60 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
2dd70 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2dd80 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Parse, sSort.pOr
2dd90 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74  derBy, 0, pEList
2dda0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53  ->nExpr);.    sS
2ddb0 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70  ort.iECursor = p
2ddc0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2ddd0 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
2dde0 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
2ddf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2de00 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2de10 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
2de20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20  sSort.iECursor, 
2de30 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
2de40 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e  nExpr+1+pEList->
2de50 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20  nExpr, 0,.      
2de60 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
2de70 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a  nfo, P4_KEYINFO.
2de80 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65        );.  }else
2de90 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72  {.    sSort.addr
2dea0 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
2deb0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2dec0 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
2ded0 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
2dee0 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
2def0 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
2df00 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
2df10 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
2df20 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
2df30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2df40 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
2df50 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
2df60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
2df70 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
2df80 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
2df90 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
2dfa0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2dfb0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
2dfc0 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c  lags & SF_FixedL
2dfd0 69 6d 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  imit)==0 ){.    
2dfe0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2dff0 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69  320;  /* 4 billi
2e000 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20  on rows */.  }. 
2e010 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
2e020 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
2e030 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  , iEnd);.  if( p
2e040 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73  ->iLimit==0 && s
2e050 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2e060 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex>=0 ){.    sql
2e070 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
2e080 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64  code(v, sSort.ad
2e090 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f  drSortIndex, OP_
2e0a0 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20  SorterOpen);.   
2e0b0 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73   sSort.sortFlags
2e0c0 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65   |= SORTFLAG_Use
2e0d0 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  Sorter;.  }..  /
2e0e0 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65  * Open an epheme
2e0f0 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ral index to use
2e100 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
2e110 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
2e120 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2e130 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  SF_Distinct ){. 
2e140 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
2e150 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Tnct = pParse->n
2e160 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74  Tab++;.    sDist
2e170 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20  inct.addrTnct = 
2e180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e190 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
2e1a0 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
2e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1c0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
2e1d0 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  bTnct, 0, 0,.   
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1f0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2e200 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  )keyInfoFromExpr
2e210 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
2e220 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20  pEList,0,0),.   
2e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e240 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
2e250 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
2e260 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2e270 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
2e280 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  D);.    sDistinc
2e290 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
2e2a0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
2e2b0 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b  RDERED;.  }else{
2e2c0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
2e2d0 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
2e2e0 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a  _DISTINCT_NOOP;.
2e2f0 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67    }..  if( !isAg
2e300 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
2e310 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67   ){.    /* No ag
2e320 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2e330 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  s and no GROUP B
2e340 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
2e350 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d  u16 wctrlFlags =
2e360 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
2e370 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f  ct ? WHERE_WANT_
2e380 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 20  DISTINCT : 0);. 
2e390 20 20 20 61 73 73 65 72 74 28 20 57 48 45 52 45     assert( WHERE
2e3a0 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46  _USE_LIMIT==SF_F
2e3b0 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20 20 20  ixedLimit );.   
2e3c0 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 70   wctrlFlags |= p
2e3d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2e3e0 46 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20 20 20  FixedLimit;..   
2e3f0 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
2e400 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a  tabase scan. */.
2e410 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
2e420 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
2e430 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2e440 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70   pWhere, sSort.p
2e450 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e470 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73          p->pELis
2e480 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70  t, wctrlFlags, p
2e490 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
2e4a0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
2e4b0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2e4c0 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  nd;.    if( sqli
2e4d0 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
2e4e0 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c  wCount(pWInfo) <
2e4f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29   p->nSelectRow )
2e500 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
2e510 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57  ctRow = sqlite3W
2e520 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
2e530 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nt(pWInfo);.    
2e540 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74 69  }.    if( sDisti
2e550 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71  nct.isTnct && sq
2e560 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
2e570 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a  inct(pWInfo) ){.
2e580 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
2e590 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69  eTnctType = sqli
2e5a0 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
2e5b0 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ct(pWInfo);.    
2e5c0 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  }.    if( sSort.
2e5d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2e5e0 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d    sSort.nOBSat =
2e5f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
2e600 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a  rdered(pWInfo);.
2e610 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f 72 64        sSort.bOrd
2e620 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20  eredInnerLoop = 
2e630 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65  sqlite3WhereOrde
2e640 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49  redInnerLoop(pWI
2e650 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
2e660 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53  sSort.nOBSat==sS
2e670 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
2e680 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
2e690 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2e6a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2e6b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
2e6c0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
2e6d0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
2e6e0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
2e6f0 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
2e700 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
2e710 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
2e720 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
2e730 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
2e740 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
2e750 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
2e760 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53     */.    if( sS
2e770 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2e780 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f  x>=0 && sSort.pO
2e790 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
2e7a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2e7b0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
2e7c0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2e7d0 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  x);.    }..    /
2e7e0 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
2e7f0 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
2e800 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
2e810 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
2e820 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53   pEList, -1, &sS
2e830 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
2e840 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
2e850 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e860 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
2e870 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e890 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
2e8a0 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
2e8b0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
2e8c0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
2e8d0 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
2e8e0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2e8f0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
2e900 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
2e910 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
2e920 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
2e930 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
2e940 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
2e950 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
2e960 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
2e970 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
2e980 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
2e990 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
2e9a0 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
2e9b0 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
2e9c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2e9d0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
2e9e0 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
2e9f0 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
2ea00 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
2ea10 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2ea20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
2ea30 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
2ea40 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
2ea50 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
2ea60 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
2ea70 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
2ea80 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
2ea90 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
2eaa0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
2eab0 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
2eac0 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
2ead0 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
2eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eaf0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
2eb00 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
2eb10 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
2eb20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
2eb30 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
2eb40 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
2eb50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
2eb60 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
2eb70 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
2eb80 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
2eb90 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
2eba0 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
2ebb0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
2ebc0 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
2ebd0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
2ebe0 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
2ebf0 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
2ec00 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
2ec10 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
2ec20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
2ec30 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
2ec40 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
2ec50 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
2ec60 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79  .    int orderBy
2ec70 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  Grp = 0; /* True
2ec80 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59   if the GROUP BY
2ec90 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72   and ORDER BY ar
2eca0 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20  e the same */.. 
2ecb0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
2ecc0 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
2ecd0 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
2ece0 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
2ecf0 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
2ed00 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
2ed10 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2ed20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
2ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed40 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2ed50 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
2ed60 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2ed70 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
2ed80 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
2ed90 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
2eda0 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
2edb0 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
2edc0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
2edd0 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
2ede0 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
2edf0 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
2ee00 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
2ee10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2ee20 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
2ee30 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
2ee40 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
2ee50 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2ee60 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
2ee70 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
2ee80 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2ee90 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
2eea0 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20  st(100) );.     
2eeb0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
2eec0 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65  ow>66 ) p->nSele
2eed0 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20  ctRow = 66;.    
2eee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2eef0 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c  ert( 0==sqlite3L
2ef00 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20  ogEst(1) );.    
2ef10 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2ef20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
2ef30 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
2ef40 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61  oth a GROUP BY a
2ef50 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  nd an ORDER BY c
2ef60 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61  lause and they a
2ef70 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69  re.    ** identi
2ef80 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  cal, then it may
2ef90 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2efa0 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45  disable the ORDE
2efb0 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20  R BY clause .   
2efc0 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e   ** on the groun
2efd0 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55  ds that the GROU
2efe0 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20  P BY will cause 
2eff0 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
2f000 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20   out .    ** in 
2f010 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
2f020 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e  r. It also may n
2f030 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42  ot - the GROUP B
2f040 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20  Y might use a.  
2f050 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e    ** database in
2f060 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20  dex that causes 
2f070 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70  rows to be group
2f080 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72  ed together as r
2f090 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62  equired.    ** b
2f0a0 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ut not actually 
2f0b0 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77  sorted. Either w
2f0c0 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ay, record the f
2f0d0 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20  act that the.   
2f0e0 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64   ** ORDER BY and
2f0f0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2f100 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62  s are the same b
2f110 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72  y setting the or
2f120 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20  derByGrp.    ** 
2f130 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
2f140 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2f150 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72  rListCompare(pGr
2f160 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72  oupBy, sSort.pOr
2f170 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b  derBy, -1)==0 ){
2f180 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72  .      orderByGr
2f190 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20  p = 1;.    }. . 
2f1a0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
2f1b0 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
2f1c0 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
2f1d0 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
2f1e0 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
2f1f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2f200 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
2f210 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
2f220 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
2f230 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
2f240 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
2f250 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
2f260 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
2f270 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
2f280 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
2f290 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
2f2a0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
2f2b0 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
2f2c0 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
2f2d0 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
2f2e0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2f2f0 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
2f300 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
2f310 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
2f320 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
2f330 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20  AggInfo.mnReg = 
2f340 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
2f350 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
2f360 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
2f370 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
2f380 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  y->nExpr : 0;.  
2f390 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
2f3a0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
2f3b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2f3c0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2f3d0 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
2f3e0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2f3f0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
2f400 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29   sSort.pOrderBy)
2f410 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
2f420 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
2f430 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2f440 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
2f450 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
2f460 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
2f470 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
2f480 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
2f490 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
2f4a0 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
2f4b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2f4c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2f4d0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
2f4e0 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
2f4f0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2f500 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  sNC.ncFlags |= N
2f510 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
2f520 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2f530 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
2f540 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
2f550 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
2f560 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  ist);.      sNC.
2f570 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49  ncFlags &= ~NC_I
2f580 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a  nAggFunc;.    }.
2f590 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52      sAggInfo.mxR
2f5a0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2f5b0 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  m;.    if( db->m
2f5c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2f5d0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
2f5e0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
2f5f0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
2f600 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
2f610 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
2f620 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
2f630 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
2f640 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
2f650 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
2f660 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2f670 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
2f680 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2f690 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
2f6a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
2f6b0 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
2f6c0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
2f6d0 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
2f6e0 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
2f6f0 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
2f700 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
2f710 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
2f720 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
2f730 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
2f740 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
2f750 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
2f760 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
2f770 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
2f780 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
2f790 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
2f7a0 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
2f7b0 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
2f7c0 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
2f7d0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
2f7e0 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
2f7f0 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
2f800 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
2f810 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
2f820 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
2f830 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2f840 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
2f850 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
2f860 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
2f870 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
2f880 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
2f890 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2f8a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2f8b0 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
2f8c0 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2f8d0 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
2f8e0 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
2f8f0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2f900 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
2f910 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
2f920 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
2f930 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
2f940 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
2f950 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
2f960 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
2f970 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
2f980 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
2f990 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
2f9a0 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
2f9b0 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
2f9c0 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
2f9d0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
2f9e0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
2f9f0 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
2fa00 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2fa10 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
2fa20 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2fa30 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
2fa40 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2fa50 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2fa60 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  y, 0, sAggInfo.n
2fa70 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
2fa80 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
2fa90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2faa0 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
2fab0 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
2fac0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2fad0 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
2fae0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
2faf0 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
2fb00 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2fb10 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
2fb20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
2fb30 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
2fb40 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
2fb50 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
2fb60 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
2fb70 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
2fb80 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2fb90 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
2fba0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2fbb0 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
2fbc0 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
2fbd0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2fbe0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2fbf0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2fc00 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
2fc10 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
2fc20 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2fc30 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
2fc40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2fc50 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
2fc60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2fc70 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2fc80 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2fc90 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
2fca0 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
2fcb0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2fcc0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2fcd0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2fce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fcf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2fd00 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
2fd10 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2fd20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
2fd30 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
2fd40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2fd50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2fd60 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
2fd70 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2fd80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2fd90 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
2fda0 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
2fdb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fdc0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
2fdd0 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65  , 0, iAMem, iAMe
2fde0 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  m+pGroupBy->nExp
2fdf0 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r-1);..      /* 
2fe00 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
2fe10 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
2fe20 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
2fe30 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
2fe40 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
2fe50 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
2fe60 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
2fe70 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
2fe80 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
2fe90 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
2fea0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
2feb0 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
2fec0 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
2fed0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
2fee0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
2fef0 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
2ff00 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
2ff10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ff20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2ff30 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2ff40 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2ff50 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2ff60 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2ff70 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2ff80 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c  Where, pGroupBy,
2ff90 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48   0,.          WH
2ffa0 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f  ERE_GROUPBY | (o
2ffb0 72 64 65 72 42 79 47 72 70 20 3f 20 57 48 45 52  rderByGrp ? WHER
2ffc0 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20  E_SORTBYGROUP : 
2ffd0 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  0), 0.      );. 
2ffe0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
2fff0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
30000 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
30010 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
30020 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70  dered(pWInfo)==p
30030 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29  GroupBy->nExpr )
30040 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
30050 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
30060 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
30070 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
30080 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
30090 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
300a0 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
300b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
300c0 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
300d0 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
300e0 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
300f0 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
30100 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
30110 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
30120 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
30130 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
30140 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
30150 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
30160 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
30170 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
30180 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
30190 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
301a0 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
301b0 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
301c0 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
301d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
301e0 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
301f0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
30200 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
30210 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
30220 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
30230 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
30240 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
30250 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
30260 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
30270 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
30280 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
30290 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ..        explai
302a0 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
302b0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
302c0 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
302d0 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
302e0 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d  s&SF_Distinct)==
302f0 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  0) ?.           
30300 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e           "DISTIN
30310 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22  CT" : "GROUP BY"
30320 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
30330 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
30340 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
30350 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
30360 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
30370 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
30380 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
30390 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
303a0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
303b0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
303c0 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66       if( sAggInf
303d0 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65  o.aCol[i].iSorte
303e0 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
303f0 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
30400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
30410 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
30420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30430 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
30440 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
30450 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
30460 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
30470 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
30480 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
30490 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
304a0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
304b0 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
304c0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  0, 0);.        j
304d0 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
304e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
304f0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
30500 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30510 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
30520 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
30530 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
30540 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
30550 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
30560 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
30570 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
30580 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
30590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
305a0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f  rCodeGetColumnTo
305b0 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Reg(pParse, .   
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 20 20 20 20 70 43 6f 6c              pCol
305e0 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
305f0 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
30600 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ble, r1);.      
30610 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
30620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
30630 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
30640 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
30650 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
30660 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30670 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
30680 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
30690 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
306a0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
306b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
306c0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
306d0 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
306e0 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
306f0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
30700 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
30710 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
30720 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
30730 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
30740 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
30750 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
30760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
30770 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
30780 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
30790 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  o.sortingIdxPTab
307a0 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50   = sortPTab = pP
307b0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
307c0 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20        sortOut = 
307d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
307e0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
307f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30800 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
30810 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c  seudo, sortPTab,
30820 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b   sortOut, nCol);
30830 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30840 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
30850 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67  _SorterSort, sAg
30860 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
30870 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
30880 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
30890 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
308a0 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72  rt")); VdbeCover
308b0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
308c0 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
308d0 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
308e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
308f0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
30900 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  );..      }..   
30910 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
30920 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  ex or temporary 
30930 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68  table used by th
30940 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a  e GROUP BY sort.
30950 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61        ** will na
30960 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20  turally deliver 
30970 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65  rows in the orde
30980 72 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  r required by th
30990 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20  e ORDER BY.     
309a0 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63   ** clause, canc
309b0 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  el the ephemeral
309c0 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65   table open code
309d0 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20  d earlier..     
309e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
309f0 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
30a00 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
30a10 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
30a20 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
30a30 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65  ss..      ** Use
30a40 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75   the SQLITE_Grou
30a50 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69  pByOrder flag wi
30a60 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
30a70 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20  RL_OPTIMIZER to 
30a80 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
30a90 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  e this optimizat
30aa0 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ion for testing 
30ab0 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20  purposes.  */.  
30ac0 20 20 20 20 69 66 28 20 6f 72 64 65 72 42 79 47      if( orderByG
30ad0 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  rp && Optimizati
30ae0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
30af0 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
30b00 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 67  r) .       && (g
30b10 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71  roupBySort || sq
30b20 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
30b30 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20  ed(pWInfo)).    
30b40 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f    ){.        sSo
30b50 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
30b60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30b70 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
30b80 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
30b90 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
30ba0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
30bb0 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
30bc0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
30bd0 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
30be0 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
30bf0 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
30c00 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
30c10 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
30c20 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
30c30 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
30c40 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
30c50 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
30c60 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
30c70 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
30c80 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
30c90 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
30ca0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
30cb0 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
30cc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
30cd0 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
30ce0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
30cf0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
30d00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
30d10 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
30d20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
30d30 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
30d40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
30d50 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
30d60 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
30d70 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
30d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d90 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50 54   sortOut, sortPT
30da0 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
30db0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
30dc0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
30dd0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
30de0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
30df0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30e00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
30e10 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54  P_Column, sortPT
30e20 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  ab, j, iBMem+j);
30e30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30e40 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
30e50 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
30e60 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
30e70 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
30e80 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
30e90 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
30ea0 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
30eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
30ec0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
30ed0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
30ee0 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
30ef0 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
30f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f10 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
30f20 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
30f30 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
30f40 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64  YINFO);.      ad
30f50 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
30f60 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
30f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30f80 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
30f90 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20 30 2c  ump, addr1+1, 0,
30fa0 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43   addr1+1); VdbeC
30fb0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
30fc0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
30fd0 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
30fe0 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50  enever the GROUP
30ff0 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20   BY changes..   
31000 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e     ** Changes in
31010 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
31020 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
31030 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
31040 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
31050 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
31060 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
31070 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
31080 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
31090 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
310a0 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
310b0 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
310c0 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
310d0 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
310e0 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
310f0 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
31100 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
31110 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
31120 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
31130 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
31140 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
31150 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
31160 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
31170 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
31180 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
31190 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
311a0 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d  se, iBMem, iAMem
311b0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
311c0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
311d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
311e0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
311f0 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
31200 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
31210 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
31220 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b  tput one row"));
31230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
31240 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
31250 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67  fPos, iAbortFlag
31260 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65  , addrEnd); Vdbe
31270 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
31280 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
31290 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20  v, "check abort 
312a0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
312b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
312c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
312d0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
312e0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
312f0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
31300 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
31310 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
31320 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
31330 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
31340 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
31350 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
31360 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
31370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
31380 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
31390 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
313a0 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
313b0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
313c0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
313d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
313e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
313f0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
31400 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
31410 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
31420 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
31430 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
31440 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
31450 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
31460 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
31470 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31480 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
31490 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67  _SorterNext, sAg
314a0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
314b0 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
314c0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
314d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
314e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
314f0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
31500 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
31510 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
31520 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
31530 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
31540 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
31550 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
31560 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
31570 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
31580 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
31590 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
315a0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
315b0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
315c0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
315d0 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
315e0 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
315f0 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
31600 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
31610 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
31620 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
31630 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
31640 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
31650 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
31660 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
31670 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
31680 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
31690 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
316a0 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
316b0 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
316c0 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
316d0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
316e0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
316f0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
31700 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
31710 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
31720 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
31730 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
31740 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
31750 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
31760 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
31770 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
31780 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
31790 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
317a0 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
317b0 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
317c0 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
317d0 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
317e0 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
317f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
31800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
31810 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
31820 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
31830 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
31840 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
31850 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
31860 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31870 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
31880 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
31890 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
318a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
318b0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
318c0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
318d0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
318e0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
318f0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
31900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31910 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
31920 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
31930 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
31940 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
31950 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
31960 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79  ent((v, "Groupby
31970 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
31980 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
31990 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
319a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
319b0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
319c0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e  tRow);.      fin
319d0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
319e0 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
319f0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
31a00 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
31a10 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
31a20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
31a30 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
31a40 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
31a50 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
31a60 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
31a70 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20   -1, &sSort,.   
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a90 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70     &sDistinct, p
31aa0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
31ab0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
31ac0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
31ad0 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
31ae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31af0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
31b00 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
31b10 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
31b20 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
31b30 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
31b40 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
31b50 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
31b60 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
31b70 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
31b80 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
31b90 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
31ba0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
31bb0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
31bc0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
31bd0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
31be0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
31bf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31c00 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
31c10 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
31c20 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
31c30 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
31c40 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67  y.  Begin aggreg
31c50 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68  ate queries with
31c60 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f  out GROUP BY: */
31c70 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
31c80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
31c90 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
31ca0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
31cb0 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65  OUNT.      Table
31cc0 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66   *pTab;.      if
31cd0 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70  ( (pTab = isSimp
31ce0 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67  leCount(p, &sAgg
31cf0 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  Info))!=0 ){.   
31d00 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d       /* If isSim
31d10 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72  pleCount() retur
31d20 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
31d30 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
31d40 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  e, then.        
31d50 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
31d60 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
31d70 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  orm:.        **.
31d80 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
31d90 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
31da0 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20  M <tbl>.        
31db0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
31dc0 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ere the Table st
31dd0 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
31de0 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c   represents tabl
31df0 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20  e <tbl>..       
31e00 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
31e10 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
31e20 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20   so common that 
31e30 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  it is optimized 
31e40 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20  specially. The. 
31e50 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75         ** OP_Cou
31e60 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
31e70 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65  s executed eithe
31e80 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20  r on the intkey 
31e90 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20  table that.     
31ea0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
31eb0 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  he data for tabl
31ec0 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e  e <tbl> or on on
31ed0 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73  e of its indexes
31ee0 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  . It.        ** 
31ef0 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65  is better to exe
31f00 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61  cute the op on a
31f10 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65  n index, as inde
31f20 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20  xes are almost. 
31f30 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
31f40 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c   spread across l
31f50 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74  ess pages than t
31f60 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
31f70 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ng tables..     
31f80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
31f90 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71  nst int iDb = sq
31fa0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
31fb0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
31fc0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
31fd0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
31fe0 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e   iCsr = pParse->
31ff0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43  nTab++;     /* C
32000 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d  ursor to scan b-
32010 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tree */.        
32020 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
32030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32040 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
32050 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
32060 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
32070 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
32080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
32090 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64  info for scanned
320a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
320b0 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
320c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
320d0 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69         /* Best i
320e0 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61  ndex found so fa
320f0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
32100 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74   iRoot = pTab->t
32110 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
32120 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
32130 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65  f scanned b-tree
32140 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c   */..        sql
32150 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
32160 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
32170 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
32180 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
32190 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
321a0 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
321b0 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ame);..        /
321c0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
321d0 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20   index that has 
321e0 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20  the lowest scan 
321f0 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  cost..        **
32200 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
32210 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20  1-04-15) Do not 
32220 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f  do a full scan o
32230 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69  f an unordered i
32240 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
32250 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
32260 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20  3-10-03) Do not 
32270 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65  count the entrie
32280 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69  s in a partial i
32290 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
322a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70  .        ** In p
322b0 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49  ractice the KeyI
322c0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69  nfo structure wi
322d0 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
322e0 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20  It is only .    
322f0 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f      ** passed to
32300 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61   keep OP_OpenRea
32310 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20  d happy..       
32320 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
32330 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
32340 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65  ) pBest = sqlite
32350 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
32360 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
32370 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
32380 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
32390 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
323a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
323b0 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  dx->bUnordered==
323c0 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
323d0 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
323e0 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20  Tab->szTabRow.  
323f0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
32400 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
32410 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
32420 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78   (!pBest || pIdx
32430 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74  ->szIdxRow<pBest
32440 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20  ->szIdxRow).    
32450 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
32460 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
32470 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
32480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32490 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20   if( pBest ){.  
324a0 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
324b0 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
324c0 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
324d0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
324e0 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
324f0 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pBest);.        
32500 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  }..        /* Op
32510 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
32520 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74  ursor, execute t
32530 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f  he OP_Count, clo
32540 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a  se the cursor. *
32550 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
32560 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
32570 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
32580 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c  Csr, iRoot, iDb,
32590 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
325a0 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
325b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
325c0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
325d0 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
325e0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
325f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32610 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
32620 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
32630 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
32640 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32650 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
32660 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
32670 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69         explainSi
32680 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65  mpleCount(pParse
32690 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a  , pTab, pBest);.
326a0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
326b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
326c0 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
326d0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
326e0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
326f0 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
32700 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
32710 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20   forms:.        
32720 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
32730 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
32740 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
32750 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
32760 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
32770 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
32780 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
32790 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
327a0 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
327b0 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
327c0 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ts.        ** as
327d0 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
327e0 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
327f0 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
32800 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
32810 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e      ** If where.
32820 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f  c is able to pro
32830 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72  duce results sor
32840 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  ted in this orde
32850 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  r, then.        
32860 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
32870 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
32880 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
32890 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
328a0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
328b0 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
328c0 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
328d0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
328e0 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  p is .        **
328f0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
32900 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
32910 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
32920 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
32930 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
32940 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
32950 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
32960 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
32970 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
32980 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
32990 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
329a0 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
329b0 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  htly.        ** 
329c0 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20  modify behavior 
329d0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
329e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
329f0 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
32a00 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
32a10 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
32a20 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
32a30 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
32a40 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
32a50 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
32a60 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
32a70 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
32a80 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
32a90 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
32aa0 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
32ab0 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
32ac0 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
32ad0 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
32ae0 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
32af0 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
32b00 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
32b10 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
32b20 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
32b30 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
32b40 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
32b50 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
32b60 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
32b70 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
32b80 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
32b90 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
32ba0 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
32bb0 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
32bc0 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
32bd0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
32be0 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
32bf0 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
32c00 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
32c10 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a  ORMAL;.        .
32c20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32c30 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
32c40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
32c50 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  ( flag==0 );.   
32c60 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76       if( p->pHav
32c70 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ing==0 ){.      
32c80 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61      flag = minMa
32c90 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f  xQuery(&sAggInfo
32ca0 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20  , &pMinMax);.   
32cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
32cc0 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c  ssert( flag==0 |
32cd0 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26  | (pMinMax!=0 &&
32ce0 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
32cf0 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  =1) );..        
32d00 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
32d10 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
32d20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
32d30 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20  up(db, pMinMax, 
32d40 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  0);.          pD
32d50 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20  el = pMinMax;.  
32d60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32d70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
32d80 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d 30 20 29   || pMinMax!=0 )
32d90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
32da0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
32db0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
32dc0 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
32dd0 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
32de0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
32df0 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
32e00 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
32e10 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
32e20 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
32e30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
32e40 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68    .        /* Th
32e50 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
32e60 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
32e70 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
32e80 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
32e90 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
32ea0 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
32eb0 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
32ec0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
32ed0 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  w.        ** of 
32ee0 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20  output..        
32ef0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74  */.        reset
32f00 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
32f10 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
32f20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
32f30 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
32f40 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
32f50 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
32f60 6e 4d 61 78 2c 20 30 2c 66 6c 61 67 2c 30 29 3b  nMax, 0,flag,0);
32f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
32f80 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
32f90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
32fa0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
32fb0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  el);.          g
32fc0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
32fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32fe0 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
32ff0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
33000 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
33010 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d  assert( pMinMax=
33020 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 || pMinMax->n
33030 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
33040 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
33050 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
33060 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  nfo)>0 ){.      
33070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
33080 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57 68  oto(v, sqlite3Wh
33090 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
330a0 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Info));.        
330b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
330c0 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
330d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
330e0 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f     (flag==WHERE_
330f0 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
33100 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
33110 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
33120 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
33130 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
33140 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
33150 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
33160 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  gInfo);.      }.
33170 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
33180 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
33190 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
331a0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
331b0 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51  ing, addrEnd, SQ
331c0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
331d0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
331e0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
331f0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  p, p->pEList, -1
33200 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  , 0, 0, .       
33210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
33220 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61  Dest, addrEnd, a
33230 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73  ddrEnd);.      s
33240 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
33250 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
33260 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
33270 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
33280 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  l(v, addrEnd);. 
33290 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66     .  } /* endif
332a0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
332b0 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74   */..  if( sDist
332c0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d  inct.eTnctType==
332d0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
332e0 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20  NORDERED ){.    
332f0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
33300 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
33310 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CT");.  }..  /* 
33320 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
33330 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
33340 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
33350 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
33360 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
33370 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
33380 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
33390 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
333a0 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
333b0 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
333c0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
333d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
333e0 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20  Sort.nOBSat>0 ? 
333f0 22 52 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f  "RIGHT PART OF O
33400 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52 20  RDER BY":"ORDER 
33410 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61  BY");.    genera
33420 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
33430 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70 45  e, p, &sSort, pE
33440 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65  List->nExpr, pDe
33450 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  st);.  }..  /* J
33460 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
33470 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f   this query.  */
33480 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
33490 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45  solveLabel(v, iE
334a0 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  nd);..  /* The S
334b0 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
334c0 6f 64 65 64 2e 20 49 66 20 74 68 65 72 65 20 69  oded. If there i
334d0 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  s an error in th
334e0 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72  e Parse structur
334f0 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  e,.  ** set the 
33500 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 31  return code to 1
33510 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 20 2a  . Otherwise 0. *
33520 2f 0a 20 20 72 63 20 3d 20 28 70 50 61 72 73 65  /.  rc = (pParse
33530 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a  ->nErr>0);..  /*
33540 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
33550 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
33560 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
33570 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
33580 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
33590 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
335a0 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
335b0 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69  ct_end:.  explai
335c0 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72  nSetInteger(pPar
335d0 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69  se->iSelectId, i
335e0 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29  RestoreSelectId)
335f0 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  ;..  /* Identify
33600 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
33610 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
33620 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65  SELECT are to be
33630 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
33640 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33650 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73  K && pDest->eDes
33660 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
33670 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
33680 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
33690 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
336a0 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  t);.  }..  sqlit
336b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
336c0 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
336d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
336e0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29   sAggInfo.aFunc)
336f0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
33700 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45  E_ENABLED.  SELE
33710 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
33720 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73  ,p,("end process
33730 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72  ing\n"));.  pPar
33740 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
33750 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  t--;.#endif.  re
33760 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.