/ Hex Artifact Content
Login

Artifact 5bda89e7cda69ef9cdd25c98ee6403ed2a3753d5ab135e24fc7a20344fd68d0a:


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 4b 65 79 46 69  , 0, pKI->nKeyFi
4dd0: 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f  eld); /* Makes O
4de0: 50 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20  P_Jump testable 
4df0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
4e00: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
4e10: 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34  , (char*)pKI, P4
4e20: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74  _KEYINFO);.    t
4e30: 65 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41  estcase( pKI->nA
4e40: 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e  llField > pKI->n
4e50: 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20  KeyField+2 );.  
4e60: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
4e70: 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
4e80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4e90: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4ea0: 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20  , nOBSat,.      
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69       pKI->nAllFi
4ee0: 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65  eld-pKI->nKeyFie
4ef0: 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a  ld-1);.    addrJ
4f00: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
4f10: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
4f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
4f40: 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20  , addrJmp+1, 0, 
4f50: 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65  addrJmp+1); Vdbe
4f60: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4f70: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
4f80: 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ut = sqlite3Vdbe
4f90: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4fa0: 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75    pSort->regRetu
4fb0: 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
4fc0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
4fd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4fe0: 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72  _Gosub, pSort->r
4ff0: 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  egReturn, pSort-
5000: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
5010: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5020: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
5030: 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45  orter, pSort->iE
5040: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
5050: 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20   iLimit ){.     
5060: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5070: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
5080: 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c  iLimit, pSort->l
5090: 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20  abelDone);.     
50a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
50b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
50c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
50d0: 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20  v, addrFirst);. 
50e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
50f0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
5100: 65 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b  egBase, regPrevK
5110: 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  ey, pSort->nOBSa
5120: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
5130: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
5140: 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69  ddrJmp);.  }.  i
5150: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
5160: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
5170: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
5180: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
5190: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
51a0: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
51b0: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
51c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
51d0: 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69  (v, op, pSort->i
51e0: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
51f0: 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
5200: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61             regBa
5210: 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65  se+nOBSat, nBase
5220: 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20  -nOBSat);.  if( 
5230: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
5240: 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20  t addr;.    int 
5250: 72 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46  r1 = 0;.    /* F
5260: 69 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75  ill the sorter u
5270: 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
5280: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e   LIMIT+OFFSET en
5290: 74 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69  tries.  (The iLi
52a0: 6d 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73  mit.    ** regis
52b0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
52c0: 65 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66  ed with value of
52d0: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20   LIMIT+OFFSET.) 
52e0: 20 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65   After the sorte
52f0: 72 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75  r.    ** fills u
5300: 70 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65  p, delete the le
5310: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
5320: 20 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61   sorter after ea
5330: 63 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a  ch insert..    *
5340: 2a 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20  * Thus we never 
5350: 68 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74  hold more than t
5360: 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  he LIMIT+OFFSET 
5370: 72 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61  rows in memory a
5380: 74 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64  t once */.    ad
5390: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
53a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
53b0: 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  otZero, iLimit);
53c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
53d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
53e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
53f0: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5400: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53  sor);.    if( pS
5410: 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  ort->bOrderedInn
5420: 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  erLoop ){.      
5430: 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
5440: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
5450: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5460: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74  OP_Column, pSort
5470: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70  ->iECursor, nExp
5480: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  r, r1);.      Vd
5490: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
54a0: 65 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eq"));.    }.   
54b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
54c0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
54d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
54e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  );.    if( pSort
54f0: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
5500: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  oop ){.      /* 
5510: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
5520: 70 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61  p is driven by a
5530: 6e 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61  n index such tha
5540: 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20  t values from.  
5550: 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
5560: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
5570: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20   inner loop are 
5580: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c  in sorted order,
5590: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69   then.      ** i
55a0: 6d 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20  mmediately jump 
55b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
55c0: 61 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65  ation of an inne
55d0: 72 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20  r loop if the.  
55e0: 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f      ** entry fro
55f0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74  m the current it
5600: 65 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  eration does not
5610: 20 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f   fit into the to
5620: 70 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54  p.      ** LIMIT
5630: 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20  +OFFSET entries 
5640: 6f 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  of the sorter. *
5650: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b  /.      int iBrk
5660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
5670: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
5680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5690: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
56a0: 45 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  Eq, regBase+nExp
56b0: 72 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20  r, iBrk, r1);.  
56c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
56d0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
56e0: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
56f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5710: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5720: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
5730: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
5740: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
5750: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
5760: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
5770: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
5780: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
5790: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
57a0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  s VM */.  int iO
57b0: 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52  ffset,      /* R
57c0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
57d0: 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74  the offset count
57e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  er */.  int iCon
57f0: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
5800: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
5810: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
5820: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f  d */.){.  if( iO
5830: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73  ffset>0 ){.    s
5840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5850: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
5860: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5870: 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 1); VdbeCovera
5880: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
5890: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
58a0: 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ET"));.  }.}../*
58b0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
58c0: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
58d0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
58e0: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
58f0: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
5900: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
5910: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
5920: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
5930: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
5940: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
5950: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
5960: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
5970: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
5980: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
5990: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
59a0: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
59b0: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
59c0: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
59d0: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
59e0: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
59f0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5a00: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5a10: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
5a20: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
5a30: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
5a40: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
5a50: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
5a60: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
5a70: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
5a80: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
5a90: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5aa0: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5ab0: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5ac0: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5ad0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5ae0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5af0: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5b00: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5b20: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
5b30: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
5b40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
5b50: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
5b60: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
5b70: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
5b80: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5b90: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5ba0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5bc0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5bd0: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5be0: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5bf0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5c10: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5c20: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
5c30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c40: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
5c50: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c  nsert, iTab, r1,
5c60: 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c   iMem, N);.  sql
5c70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
5c80: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
5c90: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
5ca0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5cb0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
5cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5cd0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
5ce0: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
5cf0: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
5d00: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
5d10: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
5d20: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
5d30: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
5d40: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
5d50: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
5d60: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
5d70: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
5d80: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73   this row.  If s
5d90: 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f  rcTab is.** zero
5da0: 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64   or more, then d
5db0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
5dc0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
5dd0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
5de0: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  y .** to get the
5df0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
5e00: 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61  ns and the colla
5e10: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
5e20: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
5e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
5e40: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
5e50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5e70: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
5e80: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5ea0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
5eb0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
5ec0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
5ed0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
5ee0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
5ef0: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
5f00: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
5f10: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
5f20: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
5f30: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
5f40: 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  e */.  SortCtx *
5f50: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f  pSort,         /
5f60: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
5f70: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
5f80: 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a  ocess ORDER BY *
5f90: 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
5fa0: 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49  *pDistinct, /* I
5fb0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f  f not NULL, info
5fc0: 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65   on how to proce
5fd0: 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20  ss DISTINCT */. 
5fe0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
5ff0: 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  st,      /* How 
6000: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
6010: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
6020: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
6030: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
6040: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
6050: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
6060: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
6070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
6080: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
6090: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
60a0: 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56  r loop */.){.  V
60b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
60c0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
60d0: 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e  .  int hasDistin
60e0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct;            /
60f0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
6100: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
6110: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
6120: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
6130: 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f  ->eDest;   /* Ho
6140: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
6150: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
6160: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
6170: 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73  iSDParm; /* Firs
6180: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69  t argument to di
6190: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
61a0: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f  .  int nResultCo
61b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
61c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
61d0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
61e0: 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d  int nPrefixReg =
61f0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
6200: 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
6210: 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20  egisters before 
6220: 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  regResult */..  
6230: 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52  /* Usually, regR
6240: 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72  esult is the fir
6250: 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72  st cell in an ar
6260: 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  ray of memory ce
6270: 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  lls.  ** contain
6280: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
6290: 72 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74  result row. In t
62a0: 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67  his case regOrig
62b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20   is set to the. 
62c0: 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20   ** same value. 
62d0: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
62e0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
62f0: 67 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f  g sent to the so
6300: 72 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76  rter, the.  ** v
6310: 61 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78  alues for any ex
6320: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
6330: 72 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20  re also part of 
6340: 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65  the sort-key are
6350: 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72   omitted.  ** fr
6360: 6f 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49  om this array. I
6370: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
6380: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65  rig is set to ze
6390: 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ro.  */.  int re
63a0: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
63b0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
63c0: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
63d0: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73   current results
63e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
63f0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
6400: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
6410: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c  mory holding ful
6420: 6c 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20  l result (or 0) 
6430: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
6440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  );.  assert( pEL
6450: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
6460: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
6470: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
6480: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
6490: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
64a0: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
64b0: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
64c0: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
64d0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
64e0: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
64f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
6500: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
6510: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
6520: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
6530: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
6540: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
6550: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
6560: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
6570: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
6580: 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ;..  if( pDest->
6590: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
65a0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
65b0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20     nPrefixReg = 
65c0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
65d0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >nExpr;.      if
65e0: 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  ( !(pSort->sortF
65f0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
6600: 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72  UseSorter) ) nPr
6610: 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20  efixReg++;.     
6620: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6630: 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20   nPrefixReg;.   
6640: 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53   }.    pDest->iS
6650: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
6660: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
6670: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
6680: 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tCol;.  }else if
6690: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e  ( pDest->iSdst+n
66a0: 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72  ResultCol > pPar
66b0: 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  se->nMem ){.    
66c0: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  /* This is an er
66d0: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68  ror condition th
66e0: 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66  at can result, f
66f0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
6700: 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a   a SELECT.    **
6710: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
6720: 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e  nd side of an IN
6730: 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  SERT contains mo
6740: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
6750: 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  s than.    ** th
6760: 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  ere are columns 
6770: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  in the table on 
6780: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65  the left.  The e
6790: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75  rror will be cau
67a0: 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72  ght.    ** and r
67b0: 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20  eported later.  
67c0: 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
67d0: 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20  ake sure enough 
67e0: 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
67f0: 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76  ted.    ** to av
6800: 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f  oid other spurio
6810: 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  us errors in the
6820: 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20   meantime. */.  
6830: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
6840: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
6850: 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  }.  pDest->nSdst
6860: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
6870: 20 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65   regOrig = regRe
6880: 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53  sult = pDest->iS
6890: 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61  dst;.  if( srcTa
68a0: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  b>=0 ){.    for(
68b0: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
68c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
68d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
68e0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
68f0: 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73  rcTab, i, regRes
6900: 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  ult+i);.      Vd
6910: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
6920: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
6930: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
6940: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
6950: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
6960: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
6970: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
6980: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
6990: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
69a0: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
69b0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
69c0: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
69d0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
69e0: 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61  /.    u8 ecelFla
69f0: 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  gs;.    if( eDes
6a00: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
6a10: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6a20: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
6a30: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
6a40: 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c   ecelFlags = SQL
6a50: 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20  ITE_ECEL_DUP;.  
6a60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
6a70: 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  celFlags = 0;.  
6a80: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72    }.    if( pSor
6a90: 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74  t && hasDistinct
6aa0: 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52  ==0 && eDest!=SR
6ab0: 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44  T_EphemTab && eD
6ac0: 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
6ad0: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  {.      /* For e
6ae0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
6af0: 6e 20 70 45 4c 69 73 74 20 74 68 61 74 20 69 73  n pEList that is
6b00: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
6b10: 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20  pression in.    
6b20: 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
6b30: 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d  Y clause (pSort-
6b40: 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20  >pOrderBy), set 
6b50: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  the associated .
6b60: 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42        ** iOrderB
6b70: 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e  yCol value to on
6b80: 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
6b90: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44  index of the ORD
6ba0: 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20  ER BY .      ** 
6bb0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69  expression withi
6bc0: 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74  n the sort-key t
6bd0: 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  hat pushOntoSort
6be0: 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61  er() will genera
6bf0: 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  te..      ** Thi
6c00: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 45 4c  s allows the pEL
6c10: 69 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20  ist field to be 
6c20: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
6c30: 20 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a   sorted record,.
6c40: 20 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20        ** saving 
6c50: 73 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79  space and CPU cy
6c60: 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cles.  */.      
6c70: 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51  ecelFlags |= (SQ
6c80: 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
6c90: 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  F|SQLITE_ECEL_RE
6ca0: 46 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  F);.      for(i=
6cb0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69  pSort->nOBSat; i
6cc0: 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79  <pSort->pOrderBy
6cd0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
6ce0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
6cf0: 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70        if( (j = p
6d00: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
6d10: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
6d20: 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20  yCol)>0 ){.     
6d30: 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 6a       pEList->a[j
6d40: 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  -1].u.x.iOrderBy
6d50: 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d  Col = i+1-pSort-
6d60: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20  >nOBSat;.       
6d70: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6d80: 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20   regOrig = 0;.  
6d90: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
6da0: 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44  t==SRT_Set || eD
6db0: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20  est==SRT_Mem .  
6dc0: 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73           || eDes
6dd0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6de0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f   || eDest==SRT_O
6df0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20  utput );.    }. 
6e00: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
6e10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
6e20: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70  xprList(pParse,p
6e30: 45 4c 69 73 74 2c 72 65 67 52 65 73 75 6c 74 2c  EList,regResult,
6e40: 30 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20  0,ecelFlags);.  
6e50: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
6e60: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
6e70: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
6e80: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
6e90: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
6ea0: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
6eb0: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
6ec0: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
6ed0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
6ee0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
6ef0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
6f00: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69  tinct ){.    swi
6f10: 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  tch( pDistinct->
6f20: 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20  eTnctType ){.   
6f30: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
6f40: 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
6f50: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
6f60: 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20   *pOp;          
6f70: 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72    /* No longer r
6f80: 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65  equired OpenEphe
6f90: 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a  meral instr. */.
6fa0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d          int iJum
6fb0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
6fc0: 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
6fd0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ion */.        i
6fe0: 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
6ff0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
7000: 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a  us row content *
7010: 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  /..        /* Al
7020: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
7030: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
7040: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67  w */.        reg
7050: 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
7060: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70  Mem+1;.        p
7070: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
7080: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20  ResultCol;..    
7090: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
70a0: 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
70b0: 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  al coded earlier
70c0: 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20   to an OP_Null. 
70d0: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74         ** sets t
70e0: 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62  he MEM_Cleared b
70f0: 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  it on the first 
7100: 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a  register of the.
7110: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
7120: 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73  ous value.  This
7130: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
7140: 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61  OP_Ne below to a
7150: 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a  lways.        **
7160: 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72   fail on the fir
7170: 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
7180: 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66  the loop even if
7190: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
71a0: 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c     ** row is all
71b0: 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20   NULLs..        
71c0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
71d0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
71e0: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
71f0: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
7200: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
7210: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44  3VdbeGetOp(v, pD
7220: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
7230: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  t);.        pOp-
7240: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c  >opcode = OP_Nul
7250: 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  l;.        pOp->
7260: 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  p1 = 1;.        
7270: 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65  pOp->p2 = regPre
7280: 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d  v;..        iJum
7290: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
72a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
72b0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20  nResultCol;.    
72c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
72d0: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
72e0: 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  .          CollS
72f0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
7300: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
7310: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
7320: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
7330: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73        if( i<nRes
7340: 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ultCol-1 ){.    
7350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7360: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7370: 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c  Ne, regResult+i,
7380: 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b   iJump, regPrev+
7390: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
73a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
73b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
73c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
73d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
73e0: 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73  v, OP_Eq, regRes
73f0: 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65  ult+i, iContinue
7400: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
7410: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
7420: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
7430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7450: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f  ngeP4(v, -1, (co
7460: 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c  nst char *)pColl
7470: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
7480: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7490: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
74a0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
74b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
74c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
74d0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
74e0: 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50  (v)==iJump || pP
74f0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7500: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
7510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7520: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
7530: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72  regResult, regPr
7540: 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ev, nResultCol-1
7550: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
7560: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7570: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
7580: 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
7590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
75a0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
75b0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
75c0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
75d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
75e0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
75f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7600: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
7610: 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
7620: 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
7630: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44  );.        codeD
7640: 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
7650: 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e  pDistinct->tabTn
7660: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
7670: 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20  ResultCol,.     
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7690: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
76a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
76b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
76c0: 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20   pSort==0 ){.   
76d0: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
76e0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
76f0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20  ntinue);.    }. 
7700: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44   }..  switch( eD
7710: 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  est ){.    /* In
7720: 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74   this mode, writ
7730: 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73  e each query res
7740: 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f  ult to the key o
7750: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  f the temporary.
7760: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61      ** table iPa
7770: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  rm..    */.#ifnd
7780: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
7790: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
77a0: 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f     case SRT_Unio
77b0: 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  n: {.      int r
77c0: 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  1;.      r1 = sq
77d0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
77e0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
77f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7800: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
7810: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
7820: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20  esultCol, r1);. 
7830: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7840: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
7850: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
7860: 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c  , r1, regResult,
7870: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
7880: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
7890: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
78a0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
78b0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
78c0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
78d0: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
78e0: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
78f0: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
7900: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
7910: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
7920: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
7930: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
7940: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
7950: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
7960: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
7970: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
7980: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7990: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44  ddOp3(v, OP_IdxD
79a0: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65  elete, iParm, re
79b0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
79c0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Col);.      brea
79d0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
79e0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
79f0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
7a00: 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  /..    /* Store 
7a10: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
7a20: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
7a30: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
7a40: 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a    case SRT_Fifo:
7a50: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69  .    case SRT_Di
7a60: 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65  stFifo:.    case
7a70: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
7a80: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
7a90: 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
7aa0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
7ab0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
7ac0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
7ad0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7ae0: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
7af0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7b00: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
7b10: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
7b20: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7b30: 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20  =SRT_Fifo );.   
7b40: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7b50: 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
7b60: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
7b70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7b80: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
7b90: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
7ba0: 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52  Col, r1+nPrefixR
7bb0: 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eg);.#ifndef SQL
7bc0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
7bd0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
7be0: 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20  T_DistFifo ){.  
7bf0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
7c00: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44  destination is D
7c10: 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75  istFifo, then cu
7c20: 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69  rsor (iParm+1) i
7c30: 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
7c40: 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  * on an ephemera
7c50: 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20  l index. If the 
7c60: 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61  current row is a
7c70: 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20  lready present. 
7c80: 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
7c90: 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77   index, do not w
7ca0: 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f  rite it to the o
7cb0: 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61  utput. If not, a
7cc0: 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  dd the.        *
7cd0: 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f  * current row to
7ce0: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70   the index and p
7cf0: 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74  roceed with writ
7d00: 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20  ing it to the.  
7d10: 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
7d20: 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20  table as well.  
7d30: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  */.        int a
7d40: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
7d50: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
7d60: 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  + 4;.        sql
7d70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
7d80: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
7d90: 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31  Parm+1, addr, r1
7da0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 0);.        Vd
7db0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
7dc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7dd0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
7de0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
7df0: 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75  rm+1, r1,regResu
7e00: 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  lt,nResultCol);.
7e10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7e20: 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pSort==0 );.    
7e30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
7e40: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
7e50: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
7e60: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
7e70: 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69  rt, p, r1+nPrefi
7e80: 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31  xReg,regResult,1
7e90: 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20  ,nPrefixReg);.  
7ea0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7eb0: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
7ec0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
7ed0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
7ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7ef0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
7f00: 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20   iParm, r2);.   
7f10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7f20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
7f30: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
7f40: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
7f50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7f60: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
7f70: 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  D);.        sqli
7f80: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7f90: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
7fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7fb0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7fc0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
7fd0: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
7fe0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7ff0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
8000: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8010: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
8020: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
8030: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
8040: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
8050: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
8060: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
8070: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
8080: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
8090: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
80a0: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
80b0: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
80c0: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
80d0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
80e0: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
80f0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8100: 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20      /* At first 
8110: 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64  glance you would
8120: 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20   think we could 
8130: 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65  optimize out the
8140: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
8150: 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73  R BY in this cas
8160: 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65  e since the orde
8170: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
8180: 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
8190: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  ** does not matt
81a0: 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d  er.  But there m
81b0: 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20  ight be a LIMIT 
81c0: 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68  clause, in which
81d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65  .        ** case
81e0: 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20   the order does 
81f0: 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  matter */.      
8200: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
8210: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
8220: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
8230: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
8240: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  ig, nResultCol, 
8250: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
8260: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8270: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
8280: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
8290: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rse);.        as
82a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72  sert( sqlite3Str
82b0: 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66  len30(pDest->zAf
82c0: 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43  fSdst)==nResultC
82d0: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ol );.        sq
82e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
82f0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
8300: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
8310: 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20  sultCol, .      
8320: 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d        r1, pDest-
8330: 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75  >zAffSdst, nResu
8340: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
8350: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
8360: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
8370: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
8380: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
8390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
83a0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
83b0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
83c0: 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c  rm, r1, regResul
83d0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
83e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
83f0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
8400: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
8410: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
8420: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
8430: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
8440: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8450: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
8460: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
8470: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
8480: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
8490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
84a0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
84b0: 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20  r, 1, iParm);.  
84c0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
84d0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
84e0: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
84f0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
8500: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
8510: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
8520: 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
8530: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
8540: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
8550: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
8560: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
8570: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8580: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61  memory cell or a
8590: 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20  rray of .    ** 
85a0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64  memory cells and
85b0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
85c0: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
85d0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
85e0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Mem: {.      if
85f0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
8600: 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75     assert( nResu
8610: 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53  ltCol<=pDest->nS
8620: 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  dst );.        p
8630: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
8640: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
8650: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
8660: 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c  Result, regOrig,
8670: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72   nResultCol, nPr
8680: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
8690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
86a0: 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f  ssert( nResultCo
86b0: 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  l==pDest->nSdst 
86c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
86d0: 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50  t( regResult==iP
86e0: 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  arm );.        /
86f0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
8700: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
8710: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
8720: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20   us */.      }. 
8730: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8740: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
8750: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8760: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
8770: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
8780: 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65  ine:       /* Se
8790: 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d  nd data to a co-
87a0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63  routine */.    c
87b0: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
87c0: 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  {        /* Retu
87d0: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  rn the results *
87e0: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
87f0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
8800: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
8810: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8820: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
8830: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
8840: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
8850: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
8860: 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65   pSort, p, regRe
8870: 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e  sult, regOrig, n
8880: 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20  ResultCol,.     
8890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88a0: 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20    nPrefixReg);. 
88b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
88c0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
88d0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ine ){.        s
88e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
88f0: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
8900: 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
8910: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8930: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
8940: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
8950: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
8960: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
8970: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
8980: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
8990: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
89a0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Col);.      }.  
89b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
89c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
89d0: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a  _OMIT_CTE.    /*
89e0: 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   Write the resul
89f0: 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69  ts into a priori
8a00: 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73  ty queue that is
8a10: 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67   order according
8a20: 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74   to.    ** pDest
8a30: 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70  ->pOrderBy (in p
8a40: 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44  SO).  pDest->iSD
8a50: 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20  Parm (in iParm) 
8a60: 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  is the cursor fo
8a70: 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65  r an.    ** inde
8a80: 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70  x with pSO->nExp
8a90: 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75  r+2 columns.  Bu
8aa0: 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20  ild a key using 
8ab0: 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73  pSO for the firs
8ac0: 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45  t.    ** pSO->nE
8ad0: 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  xpr columns, the
8ae0: 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  n make sure all 
8af0: 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20  keys are unique 
8b00: 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20  by adding a.    
8b10: 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75  ** final OP_Sequ
8b20: 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  ence column.  Th
8b30: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73  e last column is
8b40: 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61   the record as a
8b50: 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20   blob..    */.  
8b60: 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51    case SRT_DistQ
8b70: 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53  ueue:.    case S
8b80: 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20  RT_Queue: {.    
8b90: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20    int nKey;.    
8ba0: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
8bb0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
8bc0: 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Test = 0;.      
8bd0: 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20  ExprList *pSO;. 
8be0: 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74       pSO = pDest
8bf0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
8c00: 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b    assert( pSO );
8c10: 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53  .      nKey = pS
8c20: 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  O->nExpr;.      
8c30: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
8c40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
8c50: 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
8c60: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
8c70: 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a  Parse, nKey+2);.
8c80: 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b        r3 = r2+nK
8c90: 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ey+1;.      if( 
8ca0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
8cb0: 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ueue ){.        
8cc0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
8cd0: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65  ation is DistQue
8ce0: 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  ue, then cursor 
8cf0: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
8d00: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
8d10: 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72  a second ephemer
8d20: 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  al index that ho
8d30: 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65  lds all values e
8d40: 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a  very previously.
8d50: 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64          ** added
8d60: 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a   to the queue. *
8d70: 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65  /.        addrTe
8d80: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
8d90: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
8da0: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
8db0: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
8de0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
8df0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  l);.        Vdbe
8e00: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
8e10: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8e20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8e30: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
8e40: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8e50: 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20  tCol, r3);.     
8e60: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8e70: 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20  DistQueue ){.   
8e80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8e90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
8ea0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c  Insert, iParm+1,
8eb0: 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r3);.        sq
8ec0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8ed0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
8ee0: 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20  EEKRESULT);.    
8ef0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
8f00: 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b  0; i<nKey; i++){
8f10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8f20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8f30: 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20  _SCopy,.        
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53    regResult + pS
8f60: 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  O->a[i].u.x.iOrd
8f70: 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20  erByCol - 1,.   
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20         r2+i);.  
8fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8fb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8fc0: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50   OP_Sequence, iP
8fd0: 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20  arm, r2+nKey);. 
8fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ff0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
9000: 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65  eRecord, r2, nKe
9010: 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  y+2, r1);.      
9020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9030: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
9040: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
9050: 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20   r2, nKey+2);.  
9060: 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74      if( addrTest
9070: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
9080: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65  mpHere(v, addrTe
9090: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
90a0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
90b0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
90c0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
90d0: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
90e0: 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b  se, r2, nKey+2);
90f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9100: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
9110: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
9120: 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ....#if !defined
9130: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
9140: 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
9150: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
9160: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
9170: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
9180: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
9190: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
91a0: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
91b0: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
91c0: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
91d0: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
91e0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
91f0: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
9200: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
9210: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
9220: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
9230: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
9240: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
9250: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
9260: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
9270: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
9280: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9290: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
92a0: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
92b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
92c0: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
92d0: 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65  s reached.  Exce
92e0: 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72  pt, if.  ** ther
92f0: 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69  e is a sorter, i
9300: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
9310: 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65   sorter has alre
9320: 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a  ady limited.  **
9330: 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20   the output for 
9340: 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  us..  */.  if( p
9350: 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c  Sort==0 && p->iL
9360: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
9370: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9380: 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
9390: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
93a0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
93b0: 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ge(v);.  }.}../*
93c0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b  .** Allocate a K
93d0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75  eyInfo object su
93e0: 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20  fficient for an 
93f0: 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63  index of N key c
9400: 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20  olumns and.** X 
9410: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  extra columns..*
9420: 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
9430: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73  e3KeyInfoAlloc(s
9440: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
9450: 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74  N, int X){.  int
9460: 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a   nExtra = (N+X)*
9470: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
9480: 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f  )+1) - sizeof(Co
9490: 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e  llSeq*);.  KeyIn
94a0: 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44  fo *p = sqlite3D
94b0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
94c0: 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
94d0: 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66   + nExtra);.  if
94e0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53  ( p ){.    p->aS
94f0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
9500: 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a  &p->aColl[N+X];.
9510: 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64      p->nKeyField
9520: 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70   = (u16)N;.    p
9530: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75  ->nAllField = (u
9540: 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d  16)(N+X);.    p-
9550: 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
9560: 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a      p->db = db;.
9570: 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
9580: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31  .    memset(&p[1
9590: 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20  ], 0, nExtra);. 
95a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
95b0: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
95c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
95d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
95e0: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
95f0: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
9600: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
9610: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
9620: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
9630: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
9640: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d  );.    p->nRef--
9650: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  ;.    if( p->nRe
9660: 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62  f==0 ) sqlite3Db
9670: 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29  FreeNN(p->db, p)
9680: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
9690: 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  ake a new pointe
96a0: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f  r to a KeyInfo o
96b0: 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  bject.*/.KeyInfo
96c0: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
96d0: 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  Ref(KeyInfo *p){
96e0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
96f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e  assert( p->nRef>
9700: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  0 );.    p->nRef
9710: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
9720: 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   p;.}..#ifdef SQ
9730: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
9740: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
9750: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
9760: 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20   can be change. 
9770: 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   The KeyInfo obj
9780: 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20  ect.** can only 
9790: 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68  be changed if th
97a0: 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e  is is just a sin
97b0: 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  gle reference to
97c0: 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a   the object..**.
97d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
97e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73  is used only ins
97f0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
9800: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
9810: 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  nt sqlite3KeyInf
9820: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79  oIsWriteable(Key
9830: 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e  Info *p){ return
9840: 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23   p->nRef==1; }.#
9850: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9860: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
9870: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
9880: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
9890: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
98a0: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
98b0: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
98c0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
98d0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
98e0: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
98f0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
9900: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
9910: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
9920: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
9930: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
9940: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
9950: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
9960: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
9970: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
9980: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
9990: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
99a0: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
99b0: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
99c0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
99d0: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
99e0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
99f0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
9a00: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
9a10: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
9a20: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
9a30: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
9a40: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
9a50: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
9a60: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
9a70: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
9a80: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
9a90: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
9aa0: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
9ab0: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
9ac0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
9ad0: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
9ae0: 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
9af0: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
9b00: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  foFromExprList(.
9b10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9b20: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9b30: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
9b40: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
9b50: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20      /* Form the 
9b60: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66  KeyInfo object f
9b70: 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73  rom this ExprLis
9b80: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  t */.  int iStar
9b90: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
9ba0: 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63  egin with this c
9bb0: 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a  olumn of pList *
9bc0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20  /.  int nExtra  
9bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
9be0: 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20  this many extra 
9bf0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65  columns to the e
9c00: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nd */.){.  int n
9c10: 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Expr;.  KeyInfo 
9c20: 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  *pInfo;.  struct
9c30: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9c40: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
9c50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
9c60: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  b;.  int i;..  n
9c70: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
9c80: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
9c90: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
9ca0: 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74  oc(db, nExpr-iSt
9cb0: 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a  art, nExtra+1);.
9cc0: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
9cd0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
9ce0: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
9cf0: 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20  able(pInfo) );. 
9d00: 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c     for(i=iStart,
9d10: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b   pItem=pList->a+
9d20: 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b  iStart; i<nExpr;
9d30: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
9d40: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
9d50: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Coll;.      pCol
9d60: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
9d70: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
9d80: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
9d90: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
9da0: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
9db0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49  ltColl;.      pI
9dc0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
9dd0: 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  art] = pColl;.  
9de0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
9df0: 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20  Order[i-iStart] 
9e00: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
9e10: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
9e20: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
9e30: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
9e40: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
9e50: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
9e60: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
9e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
9e80: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
9e90: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
9ea0: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
9eb0: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
9ec0: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
9ed0: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
9ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9ef0: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
9f00: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
9f10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9f20: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
9f30: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
9f40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
9f50: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
9f60: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
9f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
9f80: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23    return z;.}..#
9f90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9fa0: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
9fb0: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
9fc0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
9fd0: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
9fe0: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
9ff0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
a000: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
a010: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
a020: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
a030: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
a040: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
a050: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
a060: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
a070: 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54     "USE TEMP B-T
a080: 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a  REE FOR xxx".**.
a090: 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20  ** where xxx is 
a0a0: 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54  one of "DISTINCT
a0b0: 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72  ", "ORDER BY" or
a0c0: 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61   "GROUP BY". Exa
a0d0: 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73  ctly which.** is
a0e0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
a0f0: 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65  he zUsage argume
a100: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
a110: 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  id explainTempTa
a120: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
a130: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
a140: 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  Usage){.  if( pP
a150: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
a160: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
a170: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a180: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
a190: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
a1a0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53  (pParse->db, "US
a1b0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
a1c0: 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a  R %s", zUsage);.
a1d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a1e0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
a1f0: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
a200: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
a210: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
a220: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  .  }.}../*.** As
a230: 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  sign expression 
a240: 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41  b to lvalue a. A
a250: 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20   second, no-op, 
a260: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20  version of this 
a270: 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76  macro.** is prov
a280: 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  ided when SQLITE
a290: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
a2a0: 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61   defined. This a
a2b0: 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a  llows the code.*
a2c0: 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  * in sqlite3Sele
a2d0: 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76  ct() to assign v
a2e0: 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75  alues to structu
a2f0: 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  re member variab
a300: 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79  les that.** only
a310: 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45   exist if SQLITE
a320: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
a330: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74   not defined wit
a340: 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74  hout polluting t
a350: 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20  he.** code with 
a360: 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76  #ifndef directiv
a370: 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20  es..*/.# define 
a380: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
a390: 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23  r(a, b) a = b..#
a3a0: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
a3b0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
a3c0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
a3d0: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
a3e0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
a3f0: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c  lainTempTable(y,
a400: 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  z).# define expl
a410: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c  ainSetInteger(y,
a420: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  z).#endif..#if !
a430: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a440: 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20  MIT_EXPLAIN) && 
a450: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a460: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
a470: 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  LECT)./*.** Unle
a480: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
a490: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
a4a0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
a4b0: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
a4c0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
a4d0: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
a4e0: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
a4f0: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
a500: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
a510: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
a520: 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20  ption is of one 
a530: 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73  of the two forms
a540: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  :.**.**   "COMPO
a550: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
a560: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
a570: 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50  (op)".**   "COMP
a580: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
a590: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
a5a0: 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52   USING TEMP B-TR
a5b0: 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77  EE (op)".**.** w
a5c0: 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69  here iSub1 and i
a5d0: 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74  Sub2 are the int
a5e0: 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20  egers passed as 
a5f0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
a600: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61  g.** function pa
a610: 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70  rameters, and op
a620: 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70   is the text rep
a630: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
a640: 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  he parameter.** 
a650: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
a660: 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
a670: 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65  "op" must be one
a680: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
a690: 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49  _EXCEPT,.** TK_I
a6a0: 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41  NTERSECT or TK_A
a6b0: 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f  LL. The first fo
a6c0: 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72  rm is used if ar
a6d0: 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69  gument bUseTmp i
a6e0: 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20  s .** false, or 
a6f0: 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  the second form 
a700: 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a  if it is true..*
a710: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
a720: 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a  plainComposite(.
a730: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
a760: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
a790: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
a7a0: 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20  XCEPT etc. */.  
a7b0: 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20  int iSub1,      
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31  /* Subquery id 1
a7e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c   */.  int iSub2,
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
a810: 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20  y id 2 */.  int 
a820: 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20  bUseTmp         
a830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a840: 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61  rue if a temp ta
a850: 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a  ble was used */.
a860: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ){.  assert( op=
a870: 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d  =TK_UNION || op=
a880: 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
a890: 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c  ==TK_INTERSECT |
a8a0: 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a  | op==TK_ALL );.
a8b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
a8c0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
a8d0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a8e0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61  ->pVdbe;.    cha
a8f0: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
a900: 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  3MPrintf(.      
a910: 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43    pParse->db, "C
a920: 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49  OMPOUND SUBQUERI
a930: 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28  ES %d AND %d %s(
a940: 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75  %s)", iSub1, iSu
a950: 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65  b2,.        bUse
a960: 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20  Tmp?"USING TEMP 
a970: 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c  B-TREE ":"", sel
a980: 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20  ectOpName(op).  
a990: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
a9a0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a9b0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
a9c0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
a9d0: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
a9e0: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  MIC);.  }.}.#els
a9f0: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
aa00: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
aa10: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
aa20: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
aa30: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
aa40: 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78  nComposite(v,w,x
aa50: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y,z).#endif../*
aa60: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72  .** If the inner
aa70: 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61   loop was genera
aa80: 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d  ted using a non-
aa90: 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72  null pOrderBy ar
aaa0: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  gument,.** then 
aab0: 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65  the results were
aac0: 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72   placed in a sor
aad0: 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ter.  After the 
aae0: 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74  loop is terminat
aaf0: 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  ed.** we need to
ab00: 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20   run the sorter 
ab10: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72  and output the r
ab20: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c  esults.  The fol
ab30: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
ab40: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
ab50: 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64  code needed to d
ab60: 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  o that..*/.stati
ab70: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53  c void generateS
ab80: 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65  ortTail(.  Parse
ab90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
aba0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
abb0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
abc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
abd0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
abe0: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
abf0: 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  rt,   /* Informa
ac00: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45  tion on the ORDE
ac10: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
ac20: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
ac30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ac40: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
ac50: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
ac60: 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20  *pDest /* Write 
ac70: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
ac80: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
ac90: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
aca0: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20  ->pVdbe;        
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
acc0: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
acd0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
ace0: 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72  addrBreak = pSor
acf0: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20  t->labelDone;   
ad00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
ad10: 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f   here to exit lo
ad20: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
ad30: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
ad40: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ad50: 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  v);  /* Jump her
ad60: 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65  e for next cycle
ad70: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a   */.  int addr;.
ad80: 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d    int addrOnce =
ad90: 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
ada0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
adb0: 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  erBy = pSort->pO
adc0: 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44  rderBy;.  int eD
add0: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
ade0: 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20  st;.  int iParm 
adf0: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
ae00: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a  ;.  int regRow;.
ae10: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a    int regRowid;.
ae20: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e    int iCol;.  in
ae30: 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53  t nKey;.  int iS
ae40: 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20  ortTab;         
ae50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
ae60: 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65  ter cursor to re
ae70: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
ae80: 20 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20   nSortData;     
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aea0: 54 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20  Trailing values 
aeb0: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72  to read from sor
aec0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ter */.  int i;.
aed0: 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20    int bSeq;     
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72    /* True if sor
af00: 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75  ter record inclu
af10: 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a  des seq. no. */.
af20: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
af30: 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d  t_item *aOutEx =
af40: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a   p->pEList->a;..
af50: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 42 72    assert( addrBr
af60: 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70  eak<0 );.  if( p
af70: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
af80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
af90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
afa0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
afb0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
afc0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
afd0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
afe0: 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
aff0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
b000: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
b010: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
b020: 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20  );.  }.  iTab = 
b030: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b  pSort->iECursor;
b040: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
b050: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
b060: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
b070: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d   || eDest==SRT_M
b080: 65 6d 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77  em ){.    regRow
b090: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52  id = 0;.    regR
b0a0: 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  ow = pDest->iSds
b0b0: 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  t;.    nSortData
b0c0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
b0d0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
b0e0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
b0f0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
b100: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
b110: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
b120: 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29  pParse, nColumn)
b130: 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20  ;.    nSortData 
b140: 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20  = nColumn;.  }. 
b150: 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79   nKey = pOrderBy
b160: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
b170: 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70  >nOBSat;.  if( p
b180: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
b190: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
b1a0: 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rter ){.    int 
b1b0: 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70  regSortOut = ++p
b1c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
b1d0: 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72   iSortTab = pPar
b1e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
b1f0: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
b200: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61  BkOut ){.      a
b210: 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65  ddrOnce = sqlite
b220: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
b230: 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
b240: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
b250: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b260: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
b270: 50 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62  Pseudo, iSortTab
b280: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b  , regSortOut, nK
b290: 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b  ey+1+nSortData);
b2a0: 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63  .    if( addrOnc
b2b0: 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  e ) sqlite3VdbeJ
b2c0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
b2d0: 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  nce);.    addr =
b2e0: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
b2f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
b300: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
b310: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56  ddrBreak);.    V
b320: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b330: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
b340: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
b350: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
b360: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b370: 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
b380: 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f  ata, iTab, regSo
b390: 72 74 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29  rtOut, iSortTab)
b3a0: 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a  ;.    bSeq = 0;.
b3b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
b3c0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
b3d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b3e0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
b3f0: 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
b400: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
b410: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
b420: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
b430: 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54  nue);.    iSortT
b440: 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62  ab = iTab;.    b
b450: 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66  Seq = 1;.  }.  f
b460: 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65  or(i=0, iCol=nKe
b470: 79 2b 62 53 65 71 3b 20 69 3c 6e 53 6f 72 74 44  y+bSeq; i<nSortD
b480: 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ata; i++){.    i
b490: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 69 66  nt iRead;.    if
b4a0: 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e  ( aOutEx[i].u.x.
b4b0: 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20  iOrderByCol ){. 
b4c0: 20 20 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75       iRead = aOu
b4d0: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
b4e0: 72 42 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 65  rByCol-1;.    }e
b4f0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 61 64  lse{.      iRead
b500: 20 3d 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d   = iCol++;.    }
b510: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b520: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
b530: 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69  umn, iSortTab, i
b540: 52 65 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b  Read, regRow+i);
b550: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
b560: 28 28 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45  ((v, "%s", aOutE
b570: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75  x[i].zName ? aOu
b580: 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61  tEx[i].zName : a
b590: 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29  OutEx[i].zSpan))
b5a0: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
b5b0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
b5c0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
b5d0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
b5e0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab: {.      sqli
b5f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b600: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
b610: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
b620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b630: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
b640: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
b650: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
b660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b670: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
b680: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
b690: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b6a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b6b0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
b6c0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
b6d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
b6e0: 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53  Column==sqlite3S
b6f0: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
b700: 41 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20  AffSdst) );.    
b710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b720: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
b730: 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43  cord, regRow, nC
b740: 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c  olumn, regRowid,
b750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b760: 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
b770: 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  zAffSdst, nColum
b780: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
b790: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
b7a0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
b7b0: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
b7c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b7d0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
b7e0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
b7f0: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20  Parm, regRowid, 
b800: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
b810: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b820: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
b830: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f  T_Mem: {.      /
b840: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
b850: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
b860: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
b870: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
b880: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
b890: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
b8a0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
b8b0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
b8c0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
b8d0: 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20  utine ); .      
b8e0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
b8f0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
b900: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
b910: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b920: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ine );.      if(
b930: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
b940: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
b950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b960: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
b970: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
b980: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
b990: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
b9a0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
b9b0: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
b9c0: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
b9d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b9f0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
ba00: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
ba10: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
ba20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ba30: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
ba40: 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44  id ){.    if( eD
ba50: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a  est==SRT_Set ){.
ba60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
ba70: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
ba80: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43  arse, regRow, nC
ba90: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  olumn);.    }els
baa0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
bab0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
bac0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
bad0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bae0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
baf0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
bb00: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
bb10: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
bb20: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
bb30: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
bb40: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
bb50: 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  e);.  if( pSort-
bb60: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
bb70: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
bb80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
bb90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
bba0: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
bbb0: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
bbc0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rage(v);.  }else
bbd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
bbe0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
bbf0: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
bc00: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
bc10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
bc20: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73  t->regReturn ) s
bc30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
bc40: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
bc50: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29  Sort->regReturn)
bc60: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
bc70: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
bc80: 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a  ddrBreak);.}../*
bc90: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
bca0: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
bcb0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
bcc0: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
bcd0: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
bce0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
bcf0: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
bd00: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
bd10: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
bd20: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
bd30: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
bd40: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
bd50: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
bd60: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
bd70: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
bd80: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
bd90: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
bda0: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
bdb0: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
bdc0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
bdd0: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
bde0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
bdf0: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
be00: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
be10: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
be20: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
be30: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
be40: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
be50: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
be60: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
be70: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
be80: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
be90: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
bea0: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
beb0: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
bec0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
bed0: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
bee0: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
bef0: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
bf00: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
bf10: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
bf20: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
bf30: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
bf40: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
bf50: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
bf60: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
bf70: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
bf80: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
bf90: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
bfa0: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
bfb0: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
bfc0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
bfd0: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
bfe0: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
bff0: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
c000: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
c010: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
c020: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
c030: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
c040: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
c050: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
c060: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c070: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
c080: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
c090: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
c0a0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c0b0: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
c0c0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
c0d0: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
c0e0: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c  nTypeImpl(A,B,C,
c0f0: 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20  D,E,F).#else /* 
c100: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c110: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c120: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
c130: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
c140: 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63  e(A,B,C,D,E,F) c
c150: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c  olumnTypeImpl(A,
c160: 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  B,F).#endif.stat
c170: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
c180: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
c190: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
c1a0: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
c1b0: 72 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r,.#ifdef SQLITE
c1c0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c1d0: 45 54 41 44 41 54 41 0a 20 20 63 6f 6e 73 74 20  ETADATA.  const 
c1e0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c  char **pzOrigDb,
c1f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
c200: 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e  pzOrigTab,.  con
c210: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
c220: 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38  Col,.#endif.  u8
c230: 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20   *pEstWidth.){. 
c240: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
c250: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
c260: 0a 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d  .  u8 estWidth =
c270: 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
c280: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c290: 4d 45 54 41 44 41 54 41 0a 20 20 63 68 61 72 20  METADATA.  char 
c2a0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d  const *zOrigDb =
c2b0: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
c2c0: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
c2d0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
c2e0: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64  rigCol = 0;.#end
c2f0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45  if..  assert( pE
c300: 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  xpr!=0 );.  asse
c310: 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  rt( pNC->pSrcLis
c320: 74 21 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68  t!=0 );.  switch
c330: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
c340: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
c350: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
c360: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
c370: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
c380: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
c390: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
c3a0: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
c3b0: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
c3c0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
c3d0: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
c3e0: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
c3f0: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
c400: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
c410: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
c420: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
c430: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
c440: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c450: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
c460: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
c470: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
c480: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
c490: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c4a0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
c4b0: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
c4c0: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
c4d0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
c4e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
c4f0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
c500: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
c510: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
c520: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
c530: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
c540: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
c550: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
c560: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
c570: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
c580: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54       SrcList *pT
c590: 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  abList = pNC->pS
c5a0: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  rcList;.        
c5b0: 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69  for(j=0;j<pTabLi
c5c0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
c5d0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
c5e0: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
c5f0: 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  e;j++);.        
c600: 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  if( j<pTabList->
c610: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
c620: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
c630: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
c640: 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61          pS = pTa
c650: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c  bList->a[j].pSel
c660: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ect;.        }el
c670: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
c680: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
c690: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c6a0: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
c6b0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
c6c0: 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20  /* At one time, 
c6d0: 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45  code such as "SE
c6e0: 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68  LECT new.x" with
c6f0: 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75  in a trigger wou
c700: 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ld.        ** ca
c710: 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69  use this conditi
c720: 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63  on to run.  Sinc
c730: 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20  e then, we have 
c740: 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77  restructured how
c750: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67  .        ** trig
c760: 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65  ger code is gene
c770: 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69  rated and so thi
c780: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  s condition is n
c790: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
c7a0: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48    ** possible. H
c7b0: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73  owever, it can s
c7c0: 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72  till be true for
c7d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
c7e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
c7f0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
c800: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
c810: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
c820: 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b  t1(col INTEGER);
c830: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
c840: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e  LECT (SELECT t1.
c850: 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74  col) FROM FROM t
c860: 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  1;.        **.  
c870: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f        ** when co
c880: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
c890: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
c8a0: 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20  ession "t1.col" 
c8b0: 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
c8c0: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49  ** sub-select. I
c8d0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74  n this case, set
c8e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
c8f0: 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20   to NULL, even. 
c900: 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68         ** though
c910: 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c   it should reall
c920: 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a  y be "INTEGER"..
c930: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c940: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
c950: 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20  t a problem, as 
c960: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
c970: 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e  of "t1.col" is n
c980: 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ever.        ** 
c990: 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d  used. When colum
c9a0: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
c9b0: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
c9c0: 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ion .        ** 
c9d0: 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29  "(SELECT t1.col)
c9e0: 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  ", the correct t
c9f0: 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ype is returned 
ca00: 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45  (see the TK_SELE
ca10: 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72  CT.        ** br
ca20: 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  anch below.  */.
ca30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ca40: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
ca50: 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45  sert( pTab && pE
ca60: 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20  xpr->pTab==pTab 
ca70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
ca80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
ca90: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
caa0: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
cab0: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
cac0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
cad0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
cae0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
caf0: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
cb00: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
cb10: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
cb20: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
cb30: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
cb40: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
cb50: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
cb60: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
cb70: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
cb80: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
cb90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
cba0: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
cbb0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
cbc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
cbd0: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
cbe0: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
cbf0: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
cc00: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
cc10: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
cc20: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
cc30: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
cc40: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
cc50: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
cc60: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
cc70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
cc80: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
cc90: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
cca0: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
ccb0: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
ccc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
ccd0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
cce0: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
ccf0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
cd00: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
cd10: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
cd20: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
cd30: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
cd40: 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44  (&sNC, p,&zOrigD
cd50: 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72  b,&zOrigTab,&zOr
cd60: 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68  igCol, &estWidth
cd70: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
cd80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
cd90: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
cda0: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
cdb0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
cdc0: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
cdd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
cde0: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
cdf0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
ce00: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
ce10: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
ce20: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
ce30: 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  l) );.#ifdef SQL
ce40: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
ce50: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
ce60: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
ce70: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
ce80: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
ce90: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
cea0: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
ceb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cec0: 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20       zOrigCol = 
ced0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cee0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
cef0: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
cf00: 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61  3ColumnType(&pTa
cf10: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29  b->aCol[iCol],0)
cf20: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
cf30: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
cf40: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
cf50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cf60: 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62   zOrigTab = pTab
cf70: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
cf80: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
cf90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
cfa0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
cfb0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
cfc0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
cfd0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
cfe0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20          zOrigDb 
cff0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
d000: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
d010: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
d020: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  #else.        if
d030: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
d040: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
d050: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
d060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d070: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
d080: 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61  3ColumnType(&pTa
d090: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29  b->aCol[iCol],0)
d0a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
d0b0: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
d0c0: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
d0d0: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
d0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
d0f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
d100: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
d110: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
d120: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
d130: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
d140: 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73  ssion is a sub-s
d150: 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68  elect. Return th
d160: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
d170: 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  pe and.      ** 
d180: 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20  origin info for 
d190: 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  the single colum
d1a0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
d1b0: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
d1c0: 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  T.      ** state
d1d0: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
d1e0: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
d1f0: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
d200: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
d210: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
d220: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
d230: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
d240: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
d250: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
d260: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
d270: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
d280: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
d290: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
d2a0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
d2b0: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
d2c0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
d2d0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
d2e0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
d2f0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
d300: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
d310: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
d320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d330: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
d340: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d350: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
d360: 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  A  .  if( pzOrig
d370: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
d380: 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70  ( pzOrigTab && p
d390: 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20  zOrigCol );.    
d3a0: 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69  *pzOrigDb = zOri
d3b0: 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  gDb;.    *pzOrig
d3c0: 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a  Tab = zOrigTab;.
d3d0: 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d      *pzOrigCol =
d3e0: 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23   zOrigCol;.  }.#
d3f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74  endif.  if( pEst
d400: 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64  Width ) *pEstWid
d410: 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20  th = estWidth;. 
d420: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
d430: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
d440: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
d450: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
d460: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
d470: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
d480: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
d490: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
d4a0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
d4b0: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
d4c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
d4d0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
d4e0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
d4f0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
d500: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
d510: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
d520: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
d530: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
d540: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
d550: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
d560: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
d570: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
d580: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
d590: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
d5a0: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
d5b0: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
d5c0: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
d5d0: 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e  pParse;.  sNC.pN
d5e0: 65 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ext = 0;.  for(i
d5f0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
d600: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
d610: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
d620: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
d640: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
d650: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
d660: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
d670: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
d680: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
d690: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
d6a0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
d6b0: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
d6c0: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
d6d0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d6e0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
d6f0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
d700: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
d710: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
d720: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
d730: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
d740: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
d750: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
d760: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
d770: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
d780: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
d790: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
d7a0: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
d7b0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
d7c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d7d0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d7e0: 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20  LNAME_DATABASE, 
d7f0: 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f  zOrigDb, SQLITE_
d800: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d810: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d820: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d830: 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67  AME_TABLE, zOrig
d840: 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Tab, SQLITE_TRAN
d850: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
d860: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d870: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d880: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
d890: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d8a0: 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a  NT);.#else.    z
d8b0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
d8c0: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
d8d0: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
d8e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d8f0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d900: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
d910: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
d920: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
d930: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
d940: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
d950: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f  CLTYPE) */.}.../
d960: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
d970: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
d980: 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  r a SELECT state
d990: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
d9a0: 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74  only guarantee t
d9b0: 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73  hat SQLite makes
d9c0: 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
d9d0: 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74  mes is that if t
d9e0: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73  he.** column has
d9f0: 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73   an AS clause as
da00: 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d  signing it a nam
da10: 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  e, that will be 
da20: 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a  the name used..*
da30: 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e  * That is the on
da40: 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75  ly documented gu
da50: 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65  arantee.  Howeve
da60: 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70  r, countless app
da70: 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76  lications.** dev
da80: 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20  eloped over the 
da90: 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20  years have made 
daa0: 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74  baseless assumpt
dab0: 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  ions about colum
dac0: 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77  n names.** and w
dad0: 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f  ill break if tho
dae0: 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63  se assumptions c
daf0: 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20  hanges.  Hence, 
db00: 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74  use extreme caut
db10: 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69  ion.** when modi
db20: 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  fying this routi
db30: 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61  ne to avoid brea
db40: 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a  king legacy..**.
db50: 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c  ** See Also: sql
db60: 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
db70: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20  xprList().**.** 
db80: 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74  The PRAGMA short
db90: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e  _column_names an
dba0: 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f  d PRAGMA full_co
dbb0: 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69  lumn_names setti
dbc0: 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65  ngs are.** depre
dbd0: 63 61 74 65 64 2e 20 20 54 68 65 20 64 65 66 61  cated.  The defa
dbe0: 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20 73  ult setting is s
dbf0: 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46  hort=ON, full=OF
dc00: 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c  F.  99.9% of all
dc10: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  .** applications
dc20: 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20   should operate 
dc30: 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72  this way.  Never
dc40: 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64  theless, we need
dc50: 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a   to support the.
dc60: 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66  ** other modes f
dc70: 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a  or legacy:.**.**
dc80: 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66      short=OFF, f
dc90: 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f  ull=OFF:      Co
dca0: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65  lumn name is the
dcb0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 65 78 70   text of the exp
dcc0: 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a  ression has it.*
dcd0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
dcf0: 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72  riginally appear
dd00: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
dd10: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a  statement.  In.*
dd20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
dd40: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
dd50: 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73  zSpan of the res
dd60: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ult expression..
dd70: 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f  **.**    short=O
dd80: 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20  N, full=OFF:    
dd90: 20 20 20 28 54 68 69 73 20 69 73 20 74 68 65 20     (This is the 
dda0: 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29  default setting)
ddb0: 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
ddc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
ddf0: 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   to a table colu
de00: 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  mn, then the res
de10: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20      column name 
de40: 69 73 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c  is just the tabl
de50: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 43  e column name: C
de60: 4f 4c 55 4d 4e 2e 20 0a 2a 2a 20 20 20 20 20 20  OLUMN. .**      
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 20 20 20 20 20 4f 74 68 65 72 77 69 73          Otherwis
de90: 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a  e use zSpan..**.
dea0: 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73  **    full=ON, s
deb0: 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20  hort=ANY:       
dec0: 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
ded0: 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
dee0: 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c   a table column,
def0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df10: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
df20: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74   column name wit
df30: 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
df40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42   prefix, ex: TAB
df70: 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65  LE.COLUMN.  Othe
df80: 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e  rwise use zSpan.
df90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dfa0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
dfb0: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
dfc0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
dfd0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
dfe0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
dff0: 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  t     /* Generat
e000: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
e010: 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 73  or this SELECT s
e020: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
e030: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
e040: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
e050: 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  i;.  Table *pTab
e060: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
e070: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
e080: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
e090: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e0a0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
e0b0: 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42  lName;    /* TAB
e0c0: 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20  LE.COLUMN if no 
e0d0: 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73  AS clause and is
e0e0: 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20   a direct table 
e0f0: 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ref */.  int src
e100: 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c  Name;     /* COL
e110: 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c  UMN or TABLE.COL
e120: 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61  UMN if no AS cla
e130: 75 73 65 20 61 6e 64 20 69 73 20 64 69 72 65 63  use and is direc
e140: 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  t */..#ifndef SQ
e150: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
e160: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
e170: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
e180: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
e190: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
e1a0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
e1b0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
e1c0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
e1d0: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62  olNamesSet || db
e1e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e1f0: 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f   return;.  /* Co
e200: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64  lumn names are d
e210: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
e220: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
e230: 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
e240: 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28  lect */.  while(
e250: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
e260: 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
e270: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
e280: 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65  pTabList = pSele
e290: 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69  ct->pSrc;.  pELi
e2a0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
e2b0: 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
e2c0: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
e2d0: 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b  ( pTabList!=0 );
e2e0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
e2f0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
e300: 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c  llName = (db->fl
e310: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
e320: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
e330: 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e   srcName = (db->
e340: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
e350: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
e360: 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20   || fullName;.  
e370: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
e380: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
e390: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
e3a0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
e3b0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
e3c0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
e3d0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20  >a[i].pExpr;..  
e3e0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
e3f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
e400: 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
e410: 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72  MN );  /* Agg pr
e420: 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74  ocessing has not
e430: 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20   run yet */.    
e440: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
e450: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70  K_COLUMN || p->p
e460: 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76  Tab!=0 ); /* Cov
e470: 65 72 69 6e 67 20 69 6e 64 65 78 65 73 20 6e 6f  ering indexes no
e480: 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20  t yet coded */. 
e490: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
e4a0: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
e4b0: 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75     /* An AS clau
e4c0: 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20  se always takes 
e4d0: 66 69 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a  first priority *
e4e0: 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  /.      char *zN
e4f0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
e500: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
e510: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e520: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
e530: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
e540: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
e550: 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T);.    }else if
e560: 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e  ( srcName && p->
e570: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
e580: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
e590: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
e5a0: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
e5b0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e        pTab = p->
e5c0: 70 54 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65  pTab;.      asse
e5d0: 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
e5e0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
e5f0: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
e600: 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
e610: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
e620: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
e630: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
e640: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
e650: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
e660: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
e670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e680: 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
e690: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
e6a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e6b0: 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( fullName ){.  
e6c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
e6d0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
e6e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
e6f0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
e700: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
e710: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
e720: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
e730: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
e740: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
e750: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
e760: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e780: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
e790: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
e7a0: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
e7b0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
e7c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e7d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
e7e0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
e7f0: 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20  Span;.      z = 
e800: 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50  z==0 ? sqlite3MP
e810: 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d  rintf(db, "colum
e820: 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c  n%d", i+1) : sql
e830: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
e840: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
e850: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
e860: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
e870: 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44  AME, z, SQLITE_D
e880: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
e890: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
e8a0: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
e8b0: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
e8c0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t);.}../*.** Giv
e8d0: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
e8e0: 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20   list (which is 
e8f0: 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20  really the list 
e900: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  of expressions.*
e910: 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  * that form the 
e920: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
e930: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e940: 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70  ) compute approp
e950: 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
e960: 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c  names for a tabl
e970: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c  e that would hol
e980: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
e990: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   list..**.** All
e9a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69   column names wi
e9b0: 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a  ll be unique..**
e9c0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c  .** Only the col
e9d0: 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f  umn names are co
e9e0: 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e  mputed.  Column.
e9f0: 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43  zType, Column.zC
ea00: 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  oll,.** and othe
ea10: 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75  r fields of Colu
ea20: 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  mn are zeroed..*
ea30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
ea40: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
ea50: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
ea60: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
ea70: 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65  occurs,.** store
ea80: 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20   NULL in *paCol 
ea90: 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20  and 0 in *pnCol 
eaa0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
eab0: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54  E_NOMEM..**.** T
eac0: 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65  he only guarante
ead0: 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61  e that SQLite ma
eae0: 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e  kes about column
eaf0: 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69   names is that i
eb00: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
eb10: 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65  has an AS clause
eb20: 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
eb30: 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20  name, that will 
eb40: 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64  be the name used
eb50: 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65  ..** That is the
eb60: 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64   only documented
eb70: 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77   guarantee.  How
eb80: 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20  ever, countless 
eb90: 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20  applications.** 
eba0: 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74  developed over t
ebb0: 68 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61  he years have ma
ebc0: 64 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75  de baseless assu
ebd0: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f  mptions about co
ebe0: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e  lumn names.** an
ebf0: 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20  d will break if 
ec00: 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e  those assumption
ec10: 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63  s changes.  Henc
ec20: 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63  e, use extreme c
ec30: 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d  aution.** when m
ec40: 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f  odifying this ro
ec50: 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62  utine to avoid b
ec60: 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a  reaking legacy..
ec70: 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20  **.** See Also: 
ec80: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
ec90: 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mes().*/.int sql
eca0: 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
ecb0: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
ecc0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ecd0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
ece0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
ecf0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
ed00: 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20     /* Expr list 
ed10: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65  from which to de
ed20: 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rive column name
ed30: 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f  s */.  i16 *pnCo
ed40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
ed50: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
ed60: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65  er of columns he
ed70: 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  re */.  Column *
ed80: 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20  *paCol          
ed90: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77  /* Write the new
eda0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72   column list her
edb0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
edc0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
edd0: 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73  db;   /* Databas
ede0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
edf0: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ee10: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
ee20: 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20  /.  u32 cnt;    
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74  /* Index added t
ee50: 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20  o make the name 
ee60: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75  unique */.  Colu
ee70: 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
ee80: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
ee90: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75  ooping over resu
eea0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
eeb0: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
eed0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
eee0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
eef0: 65 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  et */.  char *zN
ef00: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
ef10: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
ef20: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
ef30: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
ef40: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
ef50: 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a  ame in zName[] *
ef60: 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20  /.  Hash ht;    
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66  /* Hash table of
ef90: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
efa0: 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ..  sqlite3HashI
efb0: 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20  nit(&ht);.  if( 
efc0: 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43  pEList ){.    nC
efd0: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
efe0: 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73  pr;.    aCol = s
eff0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
f000: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43  ro(db, sizeof(aC
f010: 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20  ol[0])*nCol);.  
f020: 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c    testcase( aCol
f030: 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
f040: 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
f050: 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a    aCol = 0;.  }.
f060: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d    assert( nCol==
f070: 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a  (i16)nCol );.  *
f080: 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  pnCol = nCol;.  
f090: 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a  *paCol = aCol;..
f0a0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
f0b0: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20  aCol; i<nCol && 
f0c0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
f0d0: 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  d; i++, pCol++){
f0e0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
f0f0: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
f100: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
f110: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a     */.    if( (z
f120: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
f130: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
f140: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
f150: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
f160: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
f170: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
f180: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
f190: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
f1a0: 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70     Expr *pColExp
f1b0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
f1c0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73  kipCollate(pELis
f1d0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
f1e0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
f1f0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
f200: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  T ){.        pCo
f210: 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
f220: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
f230: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78    assert( pColEx
f240: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  pr!=0 );.      }
f250: 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 6f 6c  .      if( (pCol
f260: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
f270: 55 4d 4e 20 7c 7c 20 70 43 6f 6c 45 78 70 72 2d  UMN || pColExpr-
f280: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
f290: 4d 4e 29 0a 20 20 20 20 20 20 20 26 26 20 70 43  MN).       && pC
f2a0: 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20  olExpr->pTab!=0 
f2b0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
f2c0: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
f2d0: 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20   use the column 
f2e0: 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  name name */.   
f2f0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
f300: 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pColExpr->iColum
f310: 6e 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  n;.        Table
f320: 20 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70   *pTab = pColExp
f330: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
f340: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
f350: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
f360: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
f370: 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62  = iCol>=0 ? pTab
f380: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
f390: 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20  me : "rowid";.  
f3a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
f3b0: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  olExpr->op==TK_I
f3c0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  D ){.        ass
f3d0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
f3e0: 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20  perty(pColExpr, 
f3f0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
f400: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
f410: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
f420: 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  en;.      }else{
f430: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
f440: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
f450: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
f460: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
f470: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
f480: 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74    zName = pEList
f490: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20  ->a[i].zSpan;.  
f4a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f4b0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
f4c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
f4d0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
f4e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
f4f0: 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
f500: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
f510: 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31  b,"column%d",i+1
f520: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
f530: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
f540: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
f550: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
f560: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
f570: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
f580: 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68  an integer to th
f590: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
f5a0: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
f5b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74  ..    */.    cnt
f5c0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
f5d0: 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65   zName && sqlite
f5e0: 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a  3HashFind(&ht, z
f5f0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
f600: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
f610: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
f620: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d  ;.      if( nNam
f630: 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  e>0 ){.        f
f640: 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e  or(j=nName-1; j>
f650: 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  0 && sqlite3Isdi
f660: 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a  git(zName[j]); j
f670: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
f680: 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20  ( zName[j]==':' 
f690: 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20  ) nName = j;.   
f6a0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65     }.      zName
f6b0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
f6c0: 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c  f(db, "%.*z:%u",
f6d0: 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b   nName, zName, +
f6e0: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  +cnt);.      if(
f6f0: 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33   cnt>3 ) sqlite3
f700: 46 61 73 74 52 61 6e 64 6f 6d 6e 65 73 73 28 26  FastRandomness(&
f710: 64 62 2d 3e 73 50 72 6e 67 2c 20 73 69 7a 65 6f  db->sPrng, sizeo
f720: 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20  f(cnt), &cnt);. 
f730: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
f740: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
f750: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50    sqlite3ColumnP
f760: 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d  ropertiesFromNam
f770: 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20  e(0, pCol);.    
f780: 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c  if( zName && sql
f790: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
f7a0: 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29  ht, zName, pCol)
f7b0: 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ==pCol ){.      
f7c0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
f7d0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  db);.    }.  }. 
f7e0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
f7f0: 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62  r(&ht);.  if( db
f800: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f810: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
f820: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
f830: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f840: 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  , aCol[j].zName)
f850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
f860: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
f870: 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20  ol);.    *paCol 
f880: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20  = 0;.    *pnCol 
f890: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
f8a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
f8b0: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
f8c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f8d0: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
f8e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
f8f0: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
f900: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
f910: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
f920: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
f930: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
f940: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
f950: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
f960: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
f970: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
f980: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
f990: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
f9a0: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
f9b0: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
f9c0: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
f9d0: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
f9e0: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
f9f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
fa00: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
fa10: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
fa20: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
fa30: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
fa40: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f   resolved..*/.vo
fa50: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
fa60: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
fa70: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
fa80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
fa90: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
faa0: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c  ntexts */.  Tabl
fab0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
fac0: 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20    /* Add column 
fad0: 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  type information
fae0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
faf0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
fb00: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
fb10: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
fb20: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
fb30: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
fb40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
fb50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
fb60: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
fb70: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
fb80: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
fb90: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
fba0: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
fbb0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
fbc0: 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30  .  u64 szAll = 0
fbd0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
fbe0: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
fbf0: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
fc00: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
fc10: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
fc20: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
fc30: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
fc40: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
fc50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
fc60: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
fc70: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
fc80: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
fc90: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
fca0: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
fcb0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
fcc0: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
fcd0: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
fce0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
fcf0: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  ->aCol; i<pTab->
fd00: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
fd10: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
fd20: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69  ar *zType;.    i
fd30: 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d  nt n, m;.    p =
fd40: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
fd50: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
fd60: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
fd70: 30 2c 20 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45  0, 0, &pCol->szE
fd80: 73 74 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20 2b  st);.    szAll +
fd90: 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20  = pCol->szEst;. 
fda0: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
fdb0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
fdc0: 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20  ffinity(p);.    
fdd0: 69 66 28 20 7a 54 79 70 65 20 26 26 20 28 6d 20  if( zType && (m 
fde0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
fdf0: 30 28 7a 54 79 70 65 29 29 3e 30 20 29 7b 0a 20  0(zType))>0 ){. 
fe00: 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
fe10: 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a  Strlen30(pCol->z
fe20: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f  Name);.      pCo
fe30: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  l->zName = sqlit
fe40: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
fe50: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  e(db, pCol->zNam
fe60: 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20  e, n+m+2);.     
fe70: 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   if( pCol->zName
fe80: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
fe90: 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b  py(&pCol->zName[
fea0: 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31  n+1], zType, m+1
feb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  );.        pCol-
fec0: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
fed0: 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20  FLAG_HASTYPE;.  
fee0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fef0: 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  if( pCol->affini
ff00: 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66  ty==0 ) pCol->af
ff10: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
ff20: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43  AFF_BLOB;.    pC
ff30: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
ff40: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
ff50: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   p);.    if( pCo
ff60: 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  ll && pCol->zCol
ff70: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43  l==0 ){.      pC
ff80: 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->zColl = sqli
ff90: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ffa0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
ffb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d     }.  }.  pTab-
ffc0: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
ffd0: 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a  te3LogEst(szAll*
ffe0: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  4);.}../*.** Giv
fff0: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
10000 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
10010 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
10020 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
10030 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
10040 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
10050 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
10060 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
10070 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
10080 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
10090 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
100a0 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
100b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
100c0 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
100d0 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
100e0 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
100f0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
10100 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
10110 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
10120 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
10130 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
10140 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
10150 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
10160 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
10170 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
10180 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
10190 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
101a0 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
101b0 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
101c0 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
101d0 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
101e0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
101f0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
10200 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
10210 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10220 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
10230 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
10240 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c  fSelect() is onl
10250 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74  y used n context
10260 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64  s where lookasid
10270 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  e.  ** is disabl
10280 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
10290 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
102a0 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61 62  isable );.  pTab
102b0 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
102c0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
102d0 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ;.  pTab->nRowLo
102e0 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
102f0 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
10300 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
10310 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  );.  sqlite3Colu
10320 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
10330 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
10340 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
10350 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
10360 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  l);.  sqlite3Sel
10370 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
10380 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
10390 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65  rse, pTab, pSele
103a0 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
103b0 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
103c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
103d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
103e0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
103f0 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
10400 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
10410 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
10420 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
10430 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
10440 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
10450 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
10460 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
10470 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
10480 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
10490 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
104a0 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74 61  n pParse..*/.sta
104b0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
104c0 49 4e 45 20 56 64 62 65 20 2a 61 6c 6c 6f 63 56  INE Vdbe *allocV
104d0 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
104e0 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
104f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
10500 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
10510 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
10520 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65   v ) sqlite3Vdbe
10530 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 69  AddOp2(v, OP_Ini
10540 74 2c 20 30 2c 20 31 29 3b 0a 20 20 69 66 28 20  t, 0, 1);.  if( 
10550 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
10560 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  l==0.   && Optim
10570 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
10580 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
10590 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
105a0 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  .  ){.    pParse
105b0 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
105c0 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
105d0 6e 20 76 3b 0a 7d 0a 56 64 62 65 20 2a 73 71 6c  n v;.}.Vdbe *sql
105e0 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
105f0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
10600 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
10610 70 56 64 62 65 3b 0a 20 20 72 65 74 75 72 6e 20  pVdbe;.  return 
10620 76 20 3f 20 76 20 3a 20 61 6c 6c 6f 63 56 64 62  v ? v : allocVdb
10630 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f  e(pParse);.}.../
10640 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
10650 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
10660 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
10670 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
10680 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
10690 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
106a0 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
106b0 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
106c0 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
106d0 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
106e0 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
106f0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
10700 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
10710 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
10720 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
10730 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
10740 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
10750 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
10760 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
10770 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
10780 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
10790 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
107a0 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
107b0 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
107c0 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
107d0 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
107e0 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
107f0 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
10800 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
10810 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
10820 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
10830 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
10840 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
10850 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
10860 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
10870 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
10880 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
10890 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
108a0 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
108b0 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
108c0 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
108d0 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72  ault values (zer
108e0 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  o).** prior to c
108f0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
10900 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
10910 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20  Offset register 
10920 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
10930 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
10940 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
10950 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68   the OFFSET.  Th
10960 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65  e iLimit registe
10970 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
10980 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69   to LIMIT.  Regi
10990 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b  ster.** iOffset+
109a0 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  1 is initialized
109b0 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   to LIMIT+OFFSET
109c0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ..**.** Only if 
109d0 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
109e0 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
109f0 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
10a00 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
10a10 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
10a20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
10a30 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
10a40 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
10a50 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
10a60 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
10a70 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
10a80 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
10a90 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
10aa0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
10ab0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
10ac0 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
10ad0 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
10ae0 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
10af0 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
10b00 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
10b10 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
10b20 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   n;.  if( p->iLi
10b30 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
10b40 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
10b50 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
10b60 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
10b70 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
10b80 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75  controversy abou
10b90 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
10ba0 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
10bb0 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
10bc0 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
10bd0 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
10be0 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
10bf0 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
10c00 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
10c10 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
10c20 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
10c30 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
10c40 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20  || p->pLimit!=0 
10c50 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  );.  if( p->pLim
10c60 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69  it ){.    p->iLi
10c70 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
10c80 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
10c90 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
10ca0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
10cb0 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20     assert( v!=0 
10cc0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
10cd0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
10ce0 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29  p->pLimit, &n) )
10cf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10d00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10d10 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d  Integer, n, iLim
10d20 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  it);.      VdbeC
10d30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
10d40 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
10d50 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
10d60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10d70 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61  dbeGoto(v, iBrea
10d80 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  k);.      }else 
10d90 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e  if( n>=0 && p->n
10da0 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65  SelectRow>sqlite
10db0 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20  3LogEst((u64)n) 
10dc0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
10dd0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
10de0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
10df0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c  ;.        p->sel
10e00 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65  Flags |= SF_Fixe
10e10 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a  dLimit;.      }.
10e20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10e30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10e40 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
10e50 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  it, iLimit);.   
10e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10e70 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
10e80 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56  eInt, iLimit); V
10e90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
10ea0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
10eb0 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
10ec0 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
10ed0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10ee0 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c  (v, OP_IfNot, iL
10ef0 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
10f00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
10f10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
10f20 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
10f30 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
10f40 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
10f50 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
10f60 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
10f70 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
10f80 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
10f90 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
10fa0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10fb0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10fc0 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
10fd0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
10fe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10ff0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
11000 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
11010 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
11020 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11030 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
11040 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
11050 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11060 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20  OP_OffsetLimit, 
11070 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b  iLimit, iOffset+
11080 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  1, iOffset);.   
11090 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
110a0 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
110b0 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  "));.    }.  }.}
110c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
110d0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
110e0 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
110f0 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
11100 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
11110 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
11120 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
11130 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
11140 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
11150 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
11160 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
11170 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
11180 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
11190 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
111a0 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
111b0 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
111c0 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
111d0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
111e0 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
111f0 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
11200 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
11210 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
11220 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
11230 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
11240 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
11250 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
11260 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
11270 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
11280 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
11290 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
112a0 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
112b0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
112c0 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
112d0 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
112e0 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
112f0 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  }.  assert( iCol
11300 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c  >=0 );.  /* iCol
11310 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68   must be less th
11320 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  an p->pEList->nE
11330 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20  xpr.  Otherwise 
11340 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20  an error would. 
11350 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68   ** have been th
11360 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65  rown during name
11370 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20   resolution and 
11380 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76  we would not hav
11390 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68  e gotten.  ** th
113a0 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20  is far */.  if( 
113b0 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59  pRet==0 && ALWAY
113c0 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  S(iCol<p->pEList
113d0 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
113e0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
113f0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
11400 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
11410 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
11420 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
11430 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
11440 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
11450 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
11460 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
11470 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
11480 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44  T.** with an ORD
11490 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68  ER BY clause. Th
114a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
114b0 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e  cates and return
114c0 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73  s a KeyInfo.** s
114d0 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c  tructure suitabl
114e0 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69  e for implementi
114f0 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  ng the ORDER BY.
11500 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
11510 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
11520 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
11530 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
11540 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  oc. The calling.
11550 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
11560 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
11570 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69  nsuring that thi
11580 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
11590 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
115a0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  ed..*/.static Ke
115b0 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65  yInfo *multiSele
115c0 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
115d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
115e0 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e  Select *p, int n
115f0 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69  Extra){.  ExprLi
11600 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
11610 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
11620 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t nOrderBy = p->
11630 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
11640 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11650 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b   pParse->db;.  K
11660 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73  eyInfo *pRet = s
11670 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
11680 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b  oc(db, nOrderBy+
11690 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66  nExtra, 1);.  if
116a0 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( pRet ){.    in
116b0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
116c0 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
116d0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
116e0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
116f0 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42  pItem = &pOrderB
11700 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45  y->a[i];.      E
11710 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74  xpr *pTerm = pIt
11720 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
11730 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
11740 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ..      if( pTer
11750 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  m->flags & EP_Co
11760 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
11770 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
11780 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
11790 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  se, pTerm);.    
117a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
117b0 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
117c0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
117d0 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e  se, p, pItem->u.
117e0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29  x.iOrderByCol-1)
117f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
11800 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
11810 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
11820 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
11830 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20  ->a[i].pExpr =. 
11840 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11850 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
11860 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65  ring(pParse, pTe
11870 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  rm, pColl->zName
11880 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11890 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
118a0 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
118b0 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20  le(pRet) );.    
118c0 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d    pRet->aColl[i]
118d0 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
118e0 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pRet->aSortOrder
118f0 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
11900 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
11910 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
11920 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
11930 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11940 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _CTE./*.** This 
11950 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
11960 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63  s VDBE code to c
11970 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65  ompute the conte
11980 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43  nt of a WITH REC
11990 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20  URSIVE.** query 
119a0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
119b0 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d  **   <recursive-
119c0 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75  table> AS (<setu
119d0 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b  p-query> UNION [
119e0 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d  ALL] <recursive-
119f0 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20  query>).**      
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f     \___________/
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
11a30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
11a40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
11a50 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
11a60 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
11a70 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a             p.**.
11a80 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65  **.** There is e
11a90 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72  xactly one refer
11aa0 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75  ence to the recu
11ab0 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74  rsive-table in t
11ac0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  he FROM clause.*
11ad0 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71  * of recursive-q
11ae0 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74  uery, marked wit
11af0 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61  h the SrcList->a
11b00 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  [].fg.isRecursiv
11b10 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  e flag..**.** Th
11b20 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75  e setup-query ru
11b30 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72  ns once to gener
11b40 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73  ate an initial s
11b50 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  et of rows that 
11b60 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65  go.** into a Que
11b70 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20  ue table.  Rows 
11b80 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
11b90 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62  om the Queue tab
11ba0 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65  le one by.** one
11bb0 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72  .  Each row extr
11bc0 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
11bd0 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44   is output to pD
11be0 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73  est.  Then the s
11bf0 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74  ingle.** extract
11c00 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74  ed row (now in t
11c10 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c  he iCurrent tabl
11c20 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  e) becomes the c
11c30 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  ontent of the.**
11c40 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
11c50 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65   for a recursive
11c60 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65  -query run.  The
11c70 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72   output of the r
11c80 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a  ecursive-query.*
11c90 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20  * is added back 
11ca0 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
11cb0 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74  able.  Then anot
11cc0 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61  her row is extra
11cd0 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a  cted from Queue.
11ce0 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ** and the itera
11cf0 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75  tion continues u
11d00 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74  ntil the Queue t
11d10 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
11d20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70  *.** If the comp
11d30 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61  ound query opera
11d40 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65  tor is UNION the
11d50 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72  n no duplicate r
11d60 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20  ows are ever.** 
11d70 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
11d80 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
11d90 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61  The iDistinct ta
11da0 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79  ble keeps a copy
11db0 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20   of all rows.** 
11dc0 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62  that have ever b
11dd0 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
11de0 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73  o Queue and caus
11df0 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f  es duplicates to
11e00 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64   be.** discarded
11e10 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  .  If the operat
11e20 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c  or is UNION ALL,
11e30 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73   then duplicates
11e40 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
11e50 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72   .** If the quer
11e60 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42  y has an ORDER B
11e70 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20  Y, then entries 
11e80 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62  in the Queue tab
11e90 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a  le are kept in.*
11ea0 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  * ORDER BY order
11eb0 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65   and the first e
11ec0 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65  ntry is extracte
11ed0 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65  d for each cycle
11ee0 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e  .  Without.** an
11ef0 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51   ORDER BY, the Q
11f00 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75  ueue table is ju
11f10 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a  st a FIFO..**.**
11f20 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   If a LIMIT clau
11f30 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20  se is provided, 
11f40 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69  then the iterati
11f50 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c  on stops after L
11f60 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76  IMIT rows.** hav
11f70 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f  e been output to
11f80 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54   pDest.  A LIMIT
11f90 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74   of zero means t
11fa0 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73  o output no rows
11fb0 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69   and a.** negati
11fc0 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74  ve LIMIT means t
11fd0 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77  o output all row
11fe0 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
11ff0 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63  also an OFFSET c
12000 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20  lause.** with a 
12010 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20  positive value, 
12020 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f  then the first O
12030 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72  FFSET outputs ar
12040 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68  e discarded rath
12050 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67  er.** than being
12060 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20   sent to pDest. 
12070 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74   The LIMIT count
12080 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
12090 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53  until after OFFS
120a0 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20  ET.** rows have 
120b0 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  been skipped..*/
120c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
120d0 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
120e0 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65  veQuery(.  Parse
120f0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12100 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12110 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12120 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
12130 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20  * The recursive 
12140 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64  SELECT to be cod
12150 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
12160 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12170 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12180 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12190 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
121a0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
121b0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
121c0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72   clause of the r
121d0 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
121e0 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  /.  int nCol = p
121f0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
12200 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
12210 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
12220 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f  cursive table */
12230 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
12240 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
12250 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
12260 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
12270 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
12280 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75  .  Select *pSetu
12290 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20  p = p->pPrior;  
122a0 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75   /* The setup qu
122b0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ery */.  int add
122c0 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
122d0 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
122e0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
122f0 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  nt addrCont, add
12300 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20  rBreak;      /* 
12310 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45  CONTINUE and BRE
12320 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  AK addresses */.
12330 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
12340 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12350 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74  /* The Current t
12360 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
12370 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  gCurrent;       
12380 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
12390 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72  ter holding Curr
123a0 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
123b0 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20  nt iQueue;      
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
123d0 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  The Queue table 
123e0 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e  */.  int iDistin
123f0 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ct = 0;         
12400 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
12410 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69  unique results i
12420 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74  f UNION */.  int
12430 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66   eDest = SRT_Fif
12440 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  o;         /* Ho
12450 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75  w to write to Qu
12460 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  eue */.  SelectD
12470 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20  est destQueue;  
12480 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
12490 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20  Dest targetting 
124a0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
124b0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124d0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
124e0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
12510 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  code */.  ExprLi
12520 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
12530 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
12540 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
12550 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
12560 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20  , *pOffset;     
12570 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54    /* Saved LIMIT
12580 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20   and OFFSET */. 
12590 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72   int regLimit, r
125a0 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  egOffset;      /
125b0 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64  * Registers used
125c0 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   by LIMIT and OF
125d0 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  FSET */..  /* Ob
125e0 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  tain authorizati
125f0 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72  on to do a recur
12600 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
12610 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
12620 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
12630 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30  ITE_RECURSIVE, 0
12640 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
12650 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
12660 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
12670 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66  FSET clauses, if
12680 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20   they exist */. 
12690 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
126a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
126b0 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65  l(v);.  p->nSele
126c0 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a  ctRow = 320;  /*
126d0 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20   4 billion rows 
126e0 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
126f0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
12700 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29  e, p, addrBreak)
12710 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  ;.  pLimit = p->
12720 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65  pLimit;.  pOffse
12730 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
12740 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e    regLimit = p->
12750 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66  iLimit;.  regOff
12760 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
12770 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
12780 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
12790 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d    p->iLimit = p-
127a0 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >iOffset = 0;.  
127b0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
127c0 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f  rderBy;..  /* Lo
127d0 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20  cate the cursor 
127e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75  number of the Cu
127f0 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
12800 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53   for(i=0; ALWAYS
12810 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20  (i<pSrc->nSrc); 
12820 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53  i++){.    if( pS
12830 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65  rc->a[i].fg.isRe
12840 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
12850 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63   iCurrent = pSrc
12860 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[i].iCursor;.
12870 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12880 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
12890 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75  ocate cursors nu
128a0 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20  mbers for Queue 
128b0 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54  and Distinct.  T
128c0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
128d0 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69   for.  ** the Di
128e0 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73  stinct table mus
128f0 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  t be exactly one
12900 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75   greater than Qu
12910 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a  eue in order.  *
12920 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69  * for the SRT_Di
12930 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44  stFifo and SRT_D
12940 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61  istQueue destina
12950 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a  tions to work. *
12960 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61  /.  iQueue = pPa
12970 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
12980 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
12990 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20  ON ){.    eDest 
129a0 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54  = pOrderBy ? SRT
129b0 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54  _DistQueue : SRT
129c0 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69  _DistFifo;.    i
129d0 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
129e0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c  e->nTab++;.  }el
129f0 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  se{.    eDest = 
12a00 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51  pOrderBy ? SRT_Q
12a10 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b  ueue : SRT_Fifo;
12a20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
12a30 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
12a40 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20  stQueue, eDest, 
12a50 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41  iQueue);..  /* A
12a60 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20  llocate cursors 
12a70 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65  for Current, Que
12a80 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74  ue, and Distinct
12a90 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e  . */.  regCurren
12aa0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
12ab0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
12ac0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
12ad0 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65  enPseudo, iCurre
12ae0 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20  nt, regCurrent, 
12af0 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72  nCol);.  if( pOr
12b00 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
12b10 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
12b20 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
12b30 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
12b40 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71  e, p, 1);.    sq
12b50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12b60 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
12b70 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  ral, iQueue, pOr
12b80 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
12b90 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
12ba0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
12bb0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
12bc0 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51  INFO);.    destQ
12bd0 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20  ueue.pOrderBy = 
12be0 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73  pOrderBy;.  }els
12bf0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
12c00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
12c10 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
12c20 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  ueue, nCol);.  }
12c30 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
12c40 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22  v, "Queue table"
12c50 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69  ));.  if( iDisti
12c60 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64  nct ){.    p->ad
12c70 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
12c80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12c90 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
12ca0 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74  meral, iDistinct
12cb0 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c  , 0);.    p->sel
12cc0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
12cd0 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a  Ephemeral;.  }..
12ce0 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20    /* Detach the 
12cf0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
12d00 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e  from the compoun
12d10 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d  d SELECT */.  p-
12d20 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a  >pOrderBy = 0;..
12d30 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
12d40 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
12d50 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65  tup-query in Que
12d60 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d  ue. */.  pSetup-
12d70 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63  >pNext = 0;.  rc
12d80 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
12d90 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c  (pParse, pSetup,
12da0 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20   &destQueue);.  
12db0 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20  pSetup->pNext = 
12dc0 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  p;.  if( rc ) go
12dd0 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  to end_of_recurs
12de0 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a  ive_query;..  /*
12df0 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72   Find the next r
12e00 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20  ow in the Queue 
12e10 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20  and output that 
12e20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  row */.  addrTop
12e30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12e40 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
12e50 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42  d, iQueue, addrB
12e60 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
12e70 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72  age(v);..  /* Tr
12e80 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20  ansfer the next 
12e90 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65  row in Queue ove
12ea0 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a  r to Current */.
12eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12ec0 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
12ed0 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a  w, iCurrent); /*
12ee0 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e   To reset column
12ef0 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20   cache */.  if( 
12f00 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
12f10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f20 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
12f30 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
12f40 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75  ->nExpr+1, regCu
12f50 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  rrent);.  }else{
12f60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12f70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
12f80 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65  Data, iQueue, re
12f90 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20  gCurrent);.  }. 
12fa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12fb0 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
12fc0 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
12fd0 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c  Output the singl
12fe0 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
12ff0 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d   */.  addrCont =
13000 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
13010 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65  Label(v);.  code
13020 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66  Offset(v, regOff
13030 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  set, addrCont);.
13040 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
13050 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
13060 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74  pEList, iCurrent
13070 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
13080 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
13090 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
130a0 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
130b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130c0 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
130d0 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
130e0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
130f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13100 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13110 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
13120 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
13130 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
13140 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
13150 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
13160 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
13170 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
13180 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
13190 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
131a0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
131b0 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
131c0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
131d0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
131e0 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
131f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13200 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67  , "recursive agg
13210 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e  regate queries n
13220 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ot supported");.
13230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
13240 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
13250 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13260 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75  arse, p, &destQu
13270 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  eue);.    assert
13280 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
13290 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
132a0 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20  = pSetup;.  }.. 
132b0 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67   /* Keep running
132c0 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20   the loop until 
132d0 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70  the Queue is emp
132e0 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ty */.  sqlite3V
132f0 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54  dbeGoto(v, addrT
13300 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  op);.  sqlite3Vd
13310 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13320 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65  , addrBreak);..e
13330 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
13340 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33  query:.  sqlite3
13350 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
13360 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f  Parse->db, p->pO
13370 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f  rderBy);.  p->pO
13380 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
13390 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  y;.  p->pLimit =
133a0 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f   pLimit;.  p->pO
133b0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
133c0 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
133d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
133e0 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f  IT_CTE */../* Fo
133f0 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
13400 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
13410 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
13420 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
13430 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
13440 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13450 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
13460 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13470 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
13480 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
13490 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
134a0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
134b0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
134c0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
134d0 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c  .);../*.** Handl
134e0 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  e the special ca
134f0 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  se of a compound
13500 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69  -select that ori
13510 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a  ginates from a.*
13520 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  * VALUES clause.
13530 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68    By handling th
13540 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  is as a special 
13550 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64  case, we avoid d
13560 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e  eep.** recursion
13570 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f  , and thus do no
13580 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63  t need to enforc
13590 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  e the SQLITE_LIM
135a0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
135b0 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45  CT.** on a VALUE
135c0 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  S clause..**.** 
135d0 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c 65  Because the Sele
135e0 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e  ct object origin
135f0 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55  ates from a VALU
13600 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20  ES clause:.**   
13610 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49  (1) It has no LI
13620 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a  MIT or OFFSET.**
13630 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73     (2) All terms
13640 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a   are UNION ALL.*
13650 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73  *   (3) There is
13660 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
13670 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  use.*/.static in
13680 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c  t multiSelectVal
13690 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ues(.  Parse *pP
136a0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
136b0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
136c0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
136d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
136e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
136f0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
13700 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
13710 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
13720 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
13730 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
13740 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
13750 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 52  pPrior;.  int nR
13760 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63  ow = 1;.  int rc
13770 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
13780 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13790 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20  _MultiValue );. 
137a0 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28   do{.    assert(
137b0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
137c0 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20  F_Values );.    
137d0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
137e0 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d  K_ALL || (p->op=
137f0 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d  =TK_SELECT && p-
13800 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20  >pPrior==0) );. 
13810 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
13820 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  imit==0 );.    a
13830 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
13840 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t==0 );.    asse
13850 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
13860 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
13870 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70  xpr==p->pNext->p
13880 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
13890 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f      if( p->pPrio
138a0 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
138b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
138c0 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b  ior->pNext==p );
138d0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
138e0 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a  or;.    nRow++;.
138f0 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77    }while(1);.  w
13900 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70  hile( p ){.    p
13910 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
13920 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  r;.    p->pPrior
13930 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
13940 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13950 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
13960 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
13970 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20  pPrior;.    if( 
13980 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
13990 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
139a0 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d  nRow;.    p = p-
139b0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  >pNext;.  }.  re
139c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
139d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
139e0 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
139f0 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
13a00 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
13a10 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
13a20 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
13a30 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
13a40 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
13a50 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
13a60 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
13a70 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
13a80 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
13a90 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
13aa0 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
13ab0 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
13ac0 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
13ad0 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
13ae0 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
13af0 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
13b00 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
13b10 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
13b20 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
13b30 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
13b40 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
13b50 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
13b60 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
13b70 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
13b80 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
13b90 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
13ba0 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
13bb0 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
13bc0 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
13bd0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
13be0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
13bf0 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
13c00 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
13c10 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
13c20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
13c30 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
13c40 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
13c50 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
13c60 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
13c70 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
13c80 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
13c90 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
13ca0 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
13cc0 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
13cd0 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
13ce0 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
13cf0 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
13d00 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
13d10 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
13d20 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
13d30 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
13d40 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
13d50 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
13d60 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
13d70 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
13d80 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
13d90 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
13da0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
13db0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
13dc0 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
13dd0 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
13de0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
13df0 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
13e00 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
13e10 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
13e20 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
13e30 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
13e40 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
13e50 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
13e60 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
13e70 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
13e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13e90 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
13ea0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
13eb0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
13ec0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
13ed0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
13ee0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
13ef0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
13f00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
13f10 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
13f20 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
13f30 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
13f40 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
13f50 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
13f60 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
13f70 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
13f80 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
13f90 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13fa0 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
13fb0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
13fc0 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
13fd0 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
13fe0 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
13ff0 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
14000 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
14010 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
14020 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
14030 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
14040 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
14050 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23   connection */.#
14060 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14070 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
14080 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20   iSub1 = 0;     
14090 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
140a0 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
140b0 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d  */.  int iSub2 =
140c0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
140d0 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
140e0 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
140f0 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
14100 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
14110 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
14120 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
14130 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
14140 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
14150 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
14160 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
14170 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
14180 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
14190 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
141a0 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
141b0 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
141c0 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
141d0 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61  this much */.  a
141e0 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
141f0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
14200 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d  ve)==0 || p->op=
14210 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70  =TK_ALL || p->op
14220 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
14230 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14240 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
14250 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20  Prior;.  dest = 
14260 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
14270 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
14280 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14290 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
142a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
142b0 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
142c0 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
142d0 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
142e0 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
142f0 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
14300 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
14310 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
14320 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
14330 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14340 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
14350 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
14360 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
14370 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
14380 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
14390 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
143a0 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
143b0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
143c0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
143d0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
143e0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
143f0 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
14400 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
14410 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
14420 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
14430 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
14440 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
14450 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
14460 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
14470 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
14480 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
14490 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
144a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
144b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
144c0 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
144d0 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
144e0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
144f0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
14500 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
14510 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  * Special handli
14520 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ng for a compoun
14530 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
14540 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41  iginates as a VA
14550 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a  LUES clause..  *
14560 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
14570 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
14580 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lue ){.    rc = 
14590 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
145a0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  s(pParse, p, &de
145b0 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  st);.    goto mu
145c0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
145d0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
145e0 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
145f0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
14600 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
14610 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
14620 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
14630 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
14640 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
14650 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
14660 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73  >pEList );.  ass
14670 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
14680 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70  nExpr==pPrior->p
14690 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
146a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
146b0 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70  OMIT_CTE.  if( p
146c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
146d0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
146e0 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
146f0 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72  ursiveQuery(pPar
14700 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
14710 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
14720 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
14730 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
14740 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
14750 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
14760 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
14770 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
14780 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
14790 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
147a0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
147b0 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  st);.  }else..  
147c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
147d0 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
147e0 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
147f0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
14800 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
14810 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
14820 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
14830 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
14840 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
14850 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
14860 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
14870 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69     pPrior->iLimi
14880 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
14890 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66       pPrior->iOf
148a0 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
148b0 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
148c0 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
148d0 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  mit;.      pPrio
148e0 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->pOffset = p->
148f0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65  pOffset;.      e
14900 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14910 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
14920 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14930 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14940 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14950 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b   pPrior, &dest);
14960 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
14970 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
14980 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
14990 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
149a0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
149b0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
149c0 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
149d0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
149e0 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
149f0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
14a00 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
14a10 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
14a20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
14a30 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  t ){.        add
14a40 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14a50 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
14a60 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56  t, p->iLimit); V
14a70 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14a80 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
14a90 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
14aa0 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
14ab0 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  ched"));.       
14ac0 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20   if( p->iOffset 
14ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
14ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14af0 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
14b00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
14b20 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66  >iLimit, p->iOff
14b30 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65  set+1, p->iOffse
14b40 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
14b50 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c      }.      expl
14b60 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14b70 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
14b80 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14b90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14ba0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14bb0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74   &dest);.      t
14bc0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
14bd0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
14be0 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
14bf0 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
14c00 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
14c10 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
14c20 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
14c30 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
14c40 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
14c50 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
14c60 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
14c70 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  it.       && sql
14c80 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
14c90 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
14ca0 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20  , &nLimit).     
14cb0 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26    && nLimit>0 &&
14cc0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
14cd0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
14ce0 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20  u64)nLimit) .   
14cf0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d     ){.        p-
14d00 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
14d10 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
14d20 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  )nLimit);.      
14d30 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  }.      if( addr
14d40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14d50 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14d60 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
14d70 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
14d80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14d90 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
14da0 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
14db0 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
14dc0 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
14dd0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
14de0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
14df0 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
14e00 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
14e10 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
14e20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
14e30 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
14e40 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
14e50 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
14e60 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
14e70 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
14e80 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
14e90 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
14ea0 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
14eb0 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
14ec0 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
14ed0 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
14ee0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
14ef0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
14f00 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20  uniondest;..    
14f10 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
14f20 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a  p==TK_EXCEPT );.
14f30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14f40 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
14f50 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  );.      priorOp
14f60 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
14f70 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
14f80 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st==priorOp ){. 
14f90 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
14fa0 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
14fb0 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
14fc0 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
14fd0 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
14fe0 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
14ff0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
15000 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
15010 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61  );      /* Not a
15020 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
15030 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
15040 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15050 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
15060 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
15070 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
15080 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
15090 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
150a0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
150b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
150c0 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64   /* We will need
150d0 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
150e0 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wn temporary tab
150f0 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20  le to hold the. 
15100 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
15110 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
15120 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
15130 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
15140 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
15150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15160 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
15170 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
15180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15190 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
151a0 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  eral, unionTab, 
151b0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
151c0 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
151d0 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
151e0 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
151f0 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
15200 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52  r;.        findR
15210 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c  ightmost(p)->sel
15220 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
15230 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
15240 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
15250 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
15260 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
15270 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
15280 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
15290 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
152a0 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
152b0 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
152c0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
152d0 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
152e0 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
152f0 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65  ionTab);.      e
15300 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
15310 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
15320 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
15330 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15340 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
15350 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64   pPrior, &uniond
15360 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
15370 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
15380 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
15390 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
153a0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
153b0 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
153c0 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
153d0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  /.      if( p->o
153e0 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a  p==TK_EXCEPT ){.
153f0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
15400 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d  _Except;.      }
15410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
15420 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
15430 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
15440 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
15450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
15460 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
15470 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
15480 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
15490 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
154a0 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
154b0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
154c0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
154d0 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65       uniondest.e
154e0 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20  Dest = op;.     
154f0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
15500 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
15510 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
15520 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
15530 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
15540 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74  e, p, &uniondest
15550 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15560 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
15570 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65   );.      /* Que
15580 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
15590 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
155a0 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
155b0 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
155c0 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
155d0 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
155e0 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
155f0 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
15600 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
15610 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
15620 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
15630 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65  erBy);.      pDe
15640 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
15650 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
15660 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
15670 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
15680 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
15690 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
156a0 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
156b0 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
156c0 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
156d0 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
156e0 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
156f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
15700 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
15710 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
15720 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
15730 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
15740 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
15750 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  t;.      p->iLim
15760 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
15770 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >iOffset = 0;.. 
15780 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
15790 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
157a0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
157b0 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
157c0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
157d0 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
157e0 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
157f0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
15800 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e   unionTab==dest.
15810 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e  iSDParm || dest.
15820 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
15830 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
15840 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
15850 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
15860 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
15870 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
15880 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
15890 29 3b 0a 20 20 20 20 20 20 20 20 69 42 72 65 61  );.        iBrea
158a0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
158b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
158c0 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
158d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
158e0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  l(v);.        co
158f0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
15900 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
15910 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
15920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15930 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
15940 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
15950 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15960 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  v);.        iSta
15970 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
15980 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
15990 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
159a0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
159b0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
159c0 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ionTab,.        
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
159f0 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
15a00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15a10 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15a20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
15a30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a40 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
15a50 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
15a60 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15a70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15a80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15a90 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
15aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15ab0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
15ac0 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
15ad0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15ae0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15af0 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
15b00 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  t( p->op==TK_INT
15b10 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20  ERSECT ); {.    
15b20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
15b30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
15b40 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
15b50 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
15b60 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
15b70 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
15b80 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
15b90 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
15ba0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a  .      int r1;..
15bb0 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
15bc0 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
15bd0 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
15be0 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
15bf0 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
15c00 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
15c10 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
15c20 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
15c30 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
15c40 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
15c50 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
15c60 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
15c70 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
15c80 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
15c90 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
15ca0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
15cb0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
15cc0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64  ==0 );..      ad
15cd0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
15ce0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
15cf0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31  nEphemeral, tab1
15d00 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
15d10 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
15d20 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
15d30 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
15d40 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
15d50 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74  .      findRight
15d60 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
15d70 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
15d80 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73  meral;.      ass
15d90 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
15da0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
15db0 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
15dc0 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
15dd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
15de0 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
15df0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
15e00 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65  ctDestInit(&inte
15e10 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55  rsectdest, SRT_U
15e20 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20  nion, tab1);.   
15e30 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
15e40 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
15e50 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
15e60 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
15e70 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
15e80 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
15e90 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
15ea0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
15eb0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
15ec0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
15ed0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
15ee0 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
15ef0 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70  SELECT into temp
15f00 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
15f10 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  2".      */.    
15f20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
15f30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15f40 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
15f50 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
15f60 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
15f70 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
15f80 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
15f90 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61  rOpenEphm[1] = a
15fa0 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ddr;.      p->pP
15fb0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
15fc0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
15fd0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
15fe0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
15ff0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
16000 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
16010 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
16020 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
16030 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  SDParm = tab2;. 
16040 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
16050 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
16060 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
16070 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
16080 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
16090 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
160a0 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
160b0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
160c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
160d0 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
160e0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
160f0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
16100 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
16110 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
16120 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
16130 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
16140 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
16150 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16160 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
16170 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
16180 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
16190 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
161a0 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
161b0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
161c0 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
161d0 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
161e0 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
161f0 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
16200 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
16210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
16220 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
16230 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
16240 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
16250 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
16260 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16270 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
16280 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
16290 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
162a0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
162b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
162c0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
162d0 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56  tab1, iBreak); V
162e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
162f0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
16300 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16310 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
16320 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
16330 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
16340 44 61 74 61 2c 20 74 61 62 31 2c 20 72 31 29 3b  Data, tab1, r1);
16350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16360 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
16370 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
16380 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b  , iCont, r1, 0);
16390 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
163a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
163b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
163c0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
163d0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
163e0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
163f0 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20  EList, tab1,.   
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16410 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
16420 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
16430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16440 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
16450 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
16460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16470 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
16480 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  1, iStart); Vdbe
16490 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
164a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
164b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
164c0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
164d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
164e0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
164f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
16500 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16510 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
16520 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
16530 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
16540 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
16550 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
16560 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
16570 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
16580 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
16590 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
165a0 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
165b0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
165c0 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
165d0 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
165e0 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
165f0 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
16600 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
16610 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
16620 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
16630 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
16640 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
16650 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
16660 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
16670 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
16680 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
16690 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
166a0 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
166b0 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
166c0 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
166d0 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
166e0 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
166f0 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
16700 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
16710 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
16720 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
16730 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
16740 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
16750 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
16760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
16770 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
16780 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
16790 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
167a0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
167b0 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
167c0 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
167d0 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
167f0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
16800 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
16810 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
16820 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
16830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16840 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
16850 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
16860 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
16870 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
16880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16890 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
168a0 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
168b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
168c0 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
168d0 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
168e0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
168f0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
16900 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
16910 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
16920 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
16930 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16940 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
16950 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
16960 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
16970 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
16980 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
16990 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
169a0 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
169b0 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
169c0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
169d0 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
169e0 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
169f0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
16a00 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
16a10 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
16a20 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
16a30 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
16a40 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
16a50 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
16a60 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
16a70 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
16a80 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
16a90 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
16aa0 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
16ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
16ac0 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
16ad0 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
16ae0 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
16af0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
16b00 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
16b10 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
16b20 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
16b30 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
16b40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16b50 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
16b60 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
16b70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16b80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16b90 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16ba0 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
16bb0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
16bc0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
16bd0 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
16be0 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
16bf0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c10 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
16c20 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
16c30 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
16c40 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
16c50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
16c60 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
16c70 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
16c80 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
16c90 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
16ca0 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
16cb0 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
16cc0 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
16cd0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
16ce0 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
16cf0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16d00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16d10 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
16d20 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
16d30 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
16d40 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d  or when two or m
16d50 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63  ore terms of a c
16d60 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68  ompound select h
16d70 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
16d80 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74   size result set
16d90 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
16da0 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d  e3SelectWrongNum
16db0 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65  TermsError(Parse
16dc0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
16dd0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
16de0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
16df0 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ues ){.    sqlit
16e00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16e10 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
16e20 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
16e30 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
16e40 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s");.  }else{.  
16e50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16e60 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
16e70 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
16e80 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
16e90 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
16ea0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
16eb0 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
16ec0 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
16ed0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
16ee0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
16ef0 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
16f00 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
16f10 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
16f20 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
16f30 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
16f40 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
16f50 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
16f60 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
16f70 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
16f80 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
16f90 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
16fa0 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
16fb0 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
16fc0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
16fd0 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
16fe0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
16ff0 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
17000 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
17010 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
17020 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
17030 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
17040 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
17050 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
17060 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
17070 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
17080 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
17090 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
170a0 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
170b0 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
170c0 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
170d0 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
170e0 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
170f0 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
17100 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
17110 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
17120 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
17130 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
17140 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
17150 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
17160 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
17170 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
17180 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
17190 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
171a0 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
171b0 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
171c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
171d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
171e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
171f0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
17200 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
17210 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
17220 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
17230 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
17240 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
17250 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
17260 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
17270 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
17280 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
17290 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
172a0 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
172b0 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
172c0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
172d0 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
172e0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
172f0 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
17300 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
17310 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
17320 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
17330 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
17340 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
17350 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
17360 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
17370 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
17380 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
17390 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
173a0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
173b0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
173c0 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
173d0 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
173e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
173f0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
17400 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
17410 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
17420 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
17430 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
17440 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
17450 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
17460 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
17470 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  v ){.    int add
17480 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61  r1, addr2;.    a
17490 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
174a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
174b0 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20  fNot, regPrev); 
174c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
174d0 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
174e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
174f0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
17500 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
17510 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
17520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17540 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
17550 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
17560 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
17570 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17580 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
17590 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74  , addr2+2, iCont
175a0 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20  inue, addr2+2); 
175b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
175c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
175d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
175e0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
175f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17600 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
17610 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
17620 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
17630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17640 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
17650 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
17660 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
17670 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17680 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
17690 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
176a0 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
176b0 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
176c0 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
176d0 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
176e0 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
176f0 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  t, iContinue);..
17700 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
17710 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73  >eDest!=SRT_Exis
17720 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ts );.  assert( 
17730 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
17740 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69  T_Table );.  swi
17750 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
17760 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
17770 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
17780 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
17790 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
177a0 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
177b0 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
177c0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
177d0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
177e0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
177f0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17800 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
17810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17820 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
17830 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
17840 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
17850 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
17860 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17870 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
17880 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
17890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
178a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
178b0 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
178c0 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
178d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
178e0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
178f0 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
17900 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17910 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17920 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
17930 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17940 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
17950 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17960 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
17970 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
17980 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
17990 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
179a0 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
179b0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20  (SELECT ...)".. 
179c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
179d0 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
179e0 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65  int r1;.      te
179f0 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
17a00 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31  st>1 );.      r1
17a10 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17a20 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17a30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17a40 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
17a50 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
17a60 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
17a70 0a 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70  .          r1, p
17a80 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
17a90 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
17aa0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17ab0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
17ac0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17ad0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17ae0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17af0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
17b00 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
17b10 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
17b20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
17b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
17b40 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
17b50 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
17b60 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17b70 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
17b80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17b90 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
17ba0 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
17bb0 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
17bc0 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
17bd0 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
17be0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
17bf0 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
17c00 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
17c10 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
17c20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
17c30 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
17c40 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
17c50 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
17c60 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
17c70 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
17c80 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  0 );  testcase( 
17c90 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b  pIn->nSdst!=1 );
17ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17cb0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
17cc0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
17cd0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
17ce0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
17cf0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
17d00 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
17d10 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
17d20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17d30 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
17d40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17d50 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
17d60 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
17d70 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
17d80 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
17d90 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
17da0 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
17db0 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
17dc0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
17dd0 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
17de0 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
17df0 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
17e00 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
17e10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
17e20 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
17e30 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
17e40 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
17e50 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
17e60 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
17e70 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
17e80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17e90 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
17ea0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
17eb0 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  st->iSdst, pIn->
17ec0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
17ed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17ee0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
17ef0 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
17f00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17f10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
17f20 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
17f30 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
17f40 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
17f50 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
17f60 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
17f70 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
17f80 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
17f90 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
17fa0 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
17fb0 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
17fc0 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
17fd0 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
17fe0 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
17ff0 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
18000 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
18010 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
18020 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
18030 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
18040 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
18050 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
18060 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
18070 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
18080 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
18090 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
180a0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
180b0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
180c0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
180d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
180e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
180f0 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
18100 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
18110 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
18120 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
18130 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
18140 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
18150 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
18160 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18170 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
18180 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
18190 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
181a0 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
181b0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
181c0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
181d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
181e0 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
181f0 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
18200 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18210 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
18220 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
18230 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
18240 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
18250 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
18260 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
18270 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18280 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
18290 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
182a0 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
182b0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
182c0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
182d0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
182e0 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
182f0 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
18300 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
18310 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
18320 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
18330 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
18340 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
18350 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
18360 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
18370 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
18380 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
18390 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
183a0 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
183b0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
183c0 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
183d0 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
183e0 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
183f0 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
18400 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18410 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
18420 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
18430 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
18440 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
18450 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
18460 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
18470 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
18480 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
18490 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
184a0 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
184b0 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
184c0 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
184d0 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
184e0 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
184f0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
18500 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
18510 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
18520 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
18530 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
18540 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
18550 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
18560 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
18570 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
18580 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
18590 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
185a0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
185b0 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
185c0 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
185d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
185e0 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
185f0 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
18600 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
18610 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
18620 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
18630 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
18640 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
18650 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
18660 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
18670 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
18680 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
18690 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
186a0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
186b0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
186c0 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
186d0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
186e0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
186f0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
18700 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
18710 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
18720 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
18730 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
18740 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
18750 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
18760 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
18770 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
18780 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
18790 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
187a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
187b0 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
187c0 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
187d0 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
187e0 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
187f0 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
18800 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
18810 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
18820 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
18830 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
18840 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
18850 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
18860 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
18870 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
18880 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
18890 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
188a0 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
188b0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
188c0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
188d0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
188e0 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
188f0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
18900 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
18910 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
18920 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
18930 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
18940 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
18950 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
18960 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
18970 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
18980 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
18990 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
189a0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
189b0 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
189c0 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
189d0 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
189e0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
189f0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
18a00 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
18a10 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
18a20 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
18a30 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
18a40 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
18a50 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
18a60 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
18a70 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
18a80 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
18a90 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
18aa0 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
18ab0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
18ac0 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
18ad0 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
18ae0 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
18af0 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
18b00 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
18b10 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
18b20 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
18b30 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
18b40 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
18b50 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
18b60 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
18b70 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
18b80 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
18b90 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
18ba0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
18bb0 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
18bc0 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
18bd0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
18be0 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
18bf0 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
18c00 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
18c10 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
18c20 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
18c30 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
18c40 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
18c50 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
18c60 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
18c70 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
18c80 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
18c90 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
18ca0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
18cb0 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
18cc0 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
18cd0 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
18ce0 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
18cf0 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
18d00 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
18d10 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
18d20 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
18d30 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
18d40 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
18d50 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
18d60 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
18d70 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
18d80 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
18d90 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
18da0 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
18db0 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
18dc0 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
18dd0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
18de0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
18df0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
18e00 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
18e10 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
18e20 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
18e30 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
18e40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
18e50 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
18e60 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
18e70 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
18e80 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
18e90 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
18ea0 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
18eb0 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
18ec0 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
18ed0 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
18ee0 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
18ef0 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
18f00 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
18f10 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
18f20 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
18f30 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
18f40 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
18f50 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
18f60 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
18f70 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
18f80 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
18f90 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
18fa0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
18fb0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
18fc0 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
18fd0 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
18fe0 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
18ff0 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
19000 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
19010 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
19020 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
19030 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
19040 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
19050 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
19060 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
19070 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
19080 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
19090 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
190a0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
190b0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
190c0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
190d0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
190e0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
190f0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
19100 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
19110 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
19120 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19130 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
19140 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
19150 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
19160 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
19170 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
19180 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
19190 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
191a0 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
191b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
191c0 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
191d0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
191e0 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
191f0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
19200 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
19210 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
19220 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
19230 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
19240 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
19250 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
19260 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
19270 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
19280 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19290 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
192a0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
192b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
192c0 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
192d0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
192e0 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
192f0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
19300 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
19310 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
19320 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
19330 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
19340 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
19350 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
19360 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
19370 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
19380 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
19390 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
193a0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
193b0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
193c0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
193d0 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
193e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
193f0 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
19400 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19410 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
19420 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
19430 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
19440 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
19450 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
19460 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19470 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
19480 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
19490 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
194a0 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
194b0 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
194c0 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
194d0 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
194e0 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
194f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19500 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
19510 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
19520 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19530 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
19540 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
19550 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
19560 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
19570 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
19580 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
19590 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
195a0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
195b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
195c0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
195d0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
195e0 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
195f0 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
19600 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
19610 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
19620 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
19630 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
19640 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
19650 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
19660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
19670 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
19680 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
19690 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
196a0 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
196b0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
196c0 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
196d0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
196e0 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
196f0 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
19700 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
19710 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
19720 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
19730 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
19740 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
19750 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
19760 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
19770 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
19780 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
19790 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
197a0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
197b0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
197c0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
197d0 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
197e0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19800 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
19810 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
19820 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
19830 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
19840 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
19850 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
19860 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
19870 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
19880 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
19890 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
198a0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
198b0 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
198c0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
198d0 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
198e0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
198f0 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
19900 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
19910 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
19920 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
19930 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
19940 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
19950 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
19960 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
19970 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
19980 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
19990 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
199a0 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
199b0 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
199c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
199d0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
199e0 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
199f0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
19a00 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
19a10 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
19a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
19a30 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
19a40 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
19a50 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
19a60 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
19a70 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
19a80 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
19a90 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
19aa0 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
19ab0 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
19ac0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
19ad0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
19ae0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
19af0 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
19b00 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
19b10 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
19b20 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
19b30 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
19b40 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19b50 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
19b60 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19b70 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
19b80 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
19b90 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
19ba0 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
19bb0 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
19bc0 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
19bd0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
19be0 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
19bf0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
19c00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
19c10 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
19c20 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
19c30 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
19c40 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
19c50 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
19c60 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
19c70 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
19c80 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19c90 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
19ca0 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
19cb0 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
19cc0 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
19cd0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
19ce0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
19cf0 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
19d00 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
19d10 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
19d20 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
19d30 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
19d40 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
19d50 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19d60 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
19d70 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
19d80 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
19d90 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
19da0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
19db0 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
19dc0 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
19dd0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
19de0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
19df0 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
19e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19e10 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
19e20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
19e30 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
19e40 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
19e50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
19e60 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
19e70 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
19e80 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  KPT;.        pNe
19e90 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
19ea0 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
19eb0 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
19ec0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = i;.        p->
19ed0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
19ee0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
19ef0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
19f00 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
19f10 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
19f20 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
19f30 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
19f40 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
19f50 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
19f60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19f70 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
19f80 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
19f90 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
19fa0 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
19fb0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
19fc0 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
19fd0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
19fe0 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
19ff0 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
1a000 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
1a010 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
1a020 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
1a030 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
1a040 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
1a050 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
1a060 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
1a070 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
1a080 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
1a090 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
1a0a0 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
1a0b0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
1a0c0 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
1a0d0 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
1a0e0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a0f0 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
1a100 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31  t)*(nOrderBy + 1
1a110 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  ));.  if( aPermu
1a120 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
1a130 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1a140 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d  pItem;.    aPerm
1a150 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42  ute[0] = nOrderB
1a160 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  y;.    for(i=1, 
1a170 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
1a180 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20  a; i<=nOrderBy; 
1a190 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1a1a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1a1b0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1a1c0 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  Col>0 );.      a
1a1d0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
1a1e0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
1a1f0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1a200 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
1a210 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
1a220 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
1a230 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
1a240 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
1a250 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
1a260 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
1a270 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a280 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
1a290 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
1a2a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1a2b0 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
1a2c0 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
1a2d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1a2e0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
1a2f0 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
1a300 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
1a310 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
1a320 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
1a330 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
1a340 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1a350 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
1a360 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
1a370 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
1a380 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
1a390 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
1a3a0 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
1a3b0 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
1a3c0 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
1a3d0 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
1a3e0 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
1a3f0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1a400 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
1a410 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1a420 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
1a430 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
1a440 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
1a450 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
1a460 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a470 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
1a480 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1a490 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1a4a0 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
1a4b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a4c0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1a4d0 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
1a4e0 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
1a4f0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
1a500 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
1a510 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
1a520 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1a530 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
1a540 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
1a550 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
1a560 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
1a570 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
1a580 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
1a590 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
1a5a0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
1a5b0 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
1a5c0 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
1a5d0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
1a5e0 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
1a5f0 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
1a600 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
1a610 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
1a620 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
1a630 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
1a640 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
1a650 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
1a660 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
1a670 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
1a680 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
1a690 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
1a6a0 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
1a6b0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1a6c0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1a6d0 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
1a6e0 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
1a6f0 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
1a700 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
1a710 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
1a720 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1a730 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1a740 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1a750 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
1a760 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1a770 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
1a780 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a790 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
1a7a0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a7b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a7c0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1a7d0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
1a7e0 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
1a7f0 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
1a820 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
1a830 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a840 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
1a850 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
1a860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
1a870 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
1a880 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
1a890 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1a8a0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
1a8b0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1a8c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1a8d0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
1a8e0 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
1a8f0 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
1a900 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
1a910 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
1a920 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a930 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
1a940 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1a950 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
1a960 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
1a970 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1a980 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
1a990 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1a9a0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
1a9b0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1a9c0 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
1a9d0 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
1a9e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
1a9f0 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
1aa00 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
1aa10 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
1aa20 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
1aa30 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
1aa40 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
1aa50 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  lect..  */.  add
1aa60 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
1aa70 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1aa80 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72  r(v) + 1;.  addr
1aa90 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
1aaa0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
1aab0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1aac0 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drA, 0, addrSele
1aad0 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctA);.  VdbeComm
1aae0 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45  ent((v, "left SE
1aaf0 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f  LECT"));.  pPrio
1ab00 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  r->iLimit = regL
1ab10 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e  imitA;.  explain
1ab20 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
1ab30 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
1ab40 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
1ab50 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1ab60 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41  , pPrior, &destA
1ab70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1ab80 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
1ab90 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
1aba0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1abb0 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f  (v, addr1);..  /
1abc0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1abd0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1abe0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1abf0 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a  atement on .  **
1ac00 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65   the right - the
1ac10 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f   "B" select.  */
1ac20 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d  .  addrSelectB =
1ac30 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1ac40 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
1ac50 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
1ac60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1ac70 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1ac80 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
1ac90 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
1aca0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
1acb0 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
1acc0 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
1acd0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
1ace0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
1acf0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
1ad00 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
1ad10 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
1ad20 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49    .  explainSetI
1ad30 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
1ad40 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
1ad50 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
1ad60 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
1ad70 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
1ad80 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
1ad90 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
1ada0 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
1adb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
1adc0 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
1add0 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65  AddrB);..  /* Ge
1ade0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1adf0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
1ae00 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1ae10 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
1ae20 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
1ae30 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
1ae40 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
1ae50 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
1ae60 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1ae70 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
1ae80 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
1ae90 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
1aea0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
1aeb0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1aec0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
1aed0 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
1aee0 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
1aef0 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
1af00 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
1af10 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
1af20 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1af30 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
1af40 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
1af50 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
1af60 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
1af70 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
1af80 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
1af90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1afa0 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
1afb0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
1afc0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1afd0 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
1afe0 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
1aff0 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
1b000 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
1b010 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
1b030 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
1b040 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
1b050 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
1b060 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
1b070 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  End);.  }.  sqli
1b080 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
1b090 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20  pKeyDup);..  /* 
1b0a0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1b0b0 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
1b0c0 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
1b0d0 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
1b0e0 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1b0f0 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1b100 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
1b110 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1b120 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
1b130 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1b140 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  {.    addrEofA_n
1b150 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20  oB = addrEofA = 
1b160 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73  labelEnd;.  }els
1b170 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1b180 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1b190 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
1b1a0 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20  );.    addrEofA 
1b1b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1b1c0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1b1d0 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
1b1e0 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  tB);.    addrEof
1b1f0 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56  A_noB = sqlite3V
1b200 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b210 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1b220 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b250 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b270 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1b280 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
1b290 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
1b2a0 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
1b2b0 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
1b2c0 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d  nSelectRow);.  }
1b2d0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1b2e0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1b2f0 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1b300 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1b310 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
1b320 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1b330 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
1b340 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1b350 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1b360 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1b370 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
1b380 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
1b390 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
1b3a0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
1b3b0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
1b3c0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1b3d0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1b3e0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1b3f0 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
1b400 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1b410 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
1b420 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b430 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1b440 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
1b450 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b460 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b470 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45  regAddrA, labelE
1b480 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  nd); VdbeCoverag
1b490 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1b4a0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
1b4b0 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
1b4c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b4d0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1b4e0 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
1b4f0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1b500 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
1b510 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1b520 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
1b530 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b540 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
1b550 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
1b560 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b570 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b580 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1b590 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b5a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b5b0 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1b5c0 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
1b5d0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1b5e0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
1b5f0 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
1b600 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1b610 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1b620 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
1b630 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1b640 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
1b650 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1b660 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
1b670 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
1b680 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1b690 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
1b6a0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
1b6b0 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
1b6c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b6d0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1b6e0 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1b6f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b700 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1b710 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1b720 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1b730 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1b740 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1b750 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
1b760 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1b770 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
1b780 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
1b790 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1b7a0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
1b7b0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1b7c0 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1b7d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b7e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1b7f0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1b800 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
1b810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b820 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b830 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1b840 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b850 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b860 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1b870 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
1b880 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
1b890 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
1b8a0 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
1b8b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1b8c0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
1b8d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b8e0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b8f0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1b900 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65  A_noB); VdbeCove
1b910 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1b920 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b930 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1b940 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
1b950 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b960 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
1b970 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
1b980 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
1b990 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b9a0 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
1b9b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1b9c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
1b9d0 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
1b9e0 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
1b9f0 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
1ba00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1ba10 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
1ba20 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
1ba30 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
1ba40 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba60 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
1ba70 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  e, P4_KEYINFO);.
1ba80 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1ba90 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
1baa0 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69  PERMUTE);.  sqli
1bab0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1bac0 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
1bad0 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
1bae0 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76  drAgtB); VdbeCov
1baf0 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1bb00 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
1bb10 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
1bb20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1bb30 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
1bb40 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1bb50 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
1bb60 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 73 73  nd);..  /* Reass
1bb70 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
1bb80 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
1bb90 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
1bba0 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1bbb0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
1bbc0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
1bbd0 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1bbe0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1bbf0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
1bc00 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
1bc10 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1bc20 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
1bc30 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42   = p;..  /*** TB
1bc40 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
1bc50 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
1bc60 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
1bc70 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
1bc80 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
1bc90 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  */.  explainComp
1bca0 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
1bcb0 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
1bcc0 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  2, 0);.  return 
1bcd0 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b  pParse->nErr!=0;
1bce0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
1bcf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1bd00 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1bd10 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1bd20 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a 2f 2a 20  _OMIT_VIEW)../* 
1bd30 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
1bd40 68 65 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  he SubstContext 
1bd50 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73  object describes
1bd60 20 61 6e 20 73 75 62 73 74 69 74 75 74 69 6f 6e   an substitution
1bd70 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62 65 20 70   edit.** to be p
1bd80 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61 20 70 61  erformed on a pa
1bd90 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  rse tree..**.** 
1bda0 41 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  All references t
1bdb0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  o columns in tab
1bdc0 6c 65 20 69 54 61 62 6c 65 20 61 72 65 20 74 6f  le iTable are to
1bdd0 20 62 65 20 72 65 70 6c 61 63 65 64 20 62 79 20   be replaced by 
1bde0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1bdf0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
1be00 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64  pEList..*/.typed
1be10 65 66 20 73 74 72 75 63 74 20 53 75 62 73 74 43  ef struct SubstC
1be20 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61 72 73 65  ontext {.  Parse
1be30 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
1be40 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
1be50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1be60 20 69 6e 74 20 69 54 61 62 6c 65 3b 20 20 20 20   int iTable;    
1be70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1be80 70 6c 61 63 65 20 72 65 66 65 72 65 6e 63 65 73  place references
1be90 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
1bea0 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54 61 62 6c  /.  int iNewTabl
1beb0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1bec0 20 4e 65 77 20 74 61 62 6c 65 20 6e 75 6d 62 65   New table numbe
1bed0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66  r */.  int isLef
1bee0 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20 20 20 20  tJoin;          
1bef0 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46 5f 4e 55   /* Add TK_IF_NU
1bf00 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65 73 20 6f  LL_ROW opcodes o
1bf10 6e 20 65 61 63 68 20 72 65 70 6c 61 63 65 6d 65  n each replaceme
1bf20 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  nt */.  ExprList
1bf30 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
1bf40 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74    /* Replacement
1bf50 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
1bf60 7d 20 53 75 62 73 74 43 6f 6e 74 65 78 74 3b 0a  } SubstContext;.
1bf70 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c  ./* Forward Decl
1bf80 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  arations */.stat
1bf90 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
1bfa0 72 4c 69 73 74 28 53 75 62 73 74 43 6f 6e 74 65  rList(SubstConte
1bfb0 78 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b  xt*, ExprList*);
1bfc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1bfd0 73 74 53 65 6c 65 63 74 28 53 75 62 73 74 43 6f  stSelect(SubstCo
1bfe0 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63 74 2a 2c  ntext*, Select*,
1bff0 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63   int);../*.** Sc
1c000 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
1c010 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
1c020 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
1c030 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
1c040 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
1c050 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
1c060 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
1c070 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
1c080 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
1c090 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
1c0a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1c0b0 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
1c0c0 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
1c0d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c0e0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
1c0f0 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
1c100 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
1c110 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
1c120 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
1c130 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
1c140 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
1c150 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
1c160 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
1c170 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
1c180 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
1c190 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
1c1a0 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
1c1b0 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
1c1c0 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20  utine makes the 
1c1d0 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
1c1e0 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
1c1f0 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
1c200 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1c210 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
1c220 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1c230 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
1c240 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
1c250 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
1c260 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70  c Expr *substExp
1c270 72 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78  r(.  SubstContex
1c280 74 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a 20 44  t *pSubst,  /* D
1c290 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1c2a0 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a  e substitution *
1c2b0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
1c2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1c2d0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
1c2e0 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
1c2f0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
1c300 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
1c310 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
1c320 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1c330 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 45  _FromJoin) && pE
1c340 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
1c350 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1c360 61 62 6c 65 20 29 7b 0a 20 20 20 20 70 45 78 70  able ){.    pExp
1c370 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1c380 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65  le = pSubst->iNe
1c390 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  wTable;.  }.  if
1c3a0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1c3b0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
1c3c0 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d  >iTable==pSubst-
1c3d0 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  >iTable ){.    i
1c3e0 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
1c3f0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
1c400 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
1c410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c420 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
1c430 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79       Expr *pCopy
1c440 20 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73   = pSubst->pELis
1c450 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
1c460 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  umn].pExpr;.    
1c470 20 20 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77    Expr ifNullRow
1c480 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c490 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d  pSubst->pEList!=
1c4a0 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
1c4b0 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69  umn<pSubst->pELi
1c4c0 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1c4d0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1c4e0 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
1c4f0 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
1c500 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1c510 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
1c520 70 43 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20  pCopy) ){.      
1c530 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45    sqlite3VectorE
1c540 72 72 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e  rrorMsg(pSubst->
1c550 70 50 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a  pParse, pCopy);.
1c560 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c570 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1c580 20 3d 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73   = pSubst->pPars
1c590 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69  e->db;.        i
1c5a0 66 28 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66  f( pSubst->isLef
1c5b0 74 4a 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e  tJoin && pCopy->
1c5c0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
1c5d0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
1c5e0 74 28 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c  t(&ifNullRow, 0,
1c5f0 20 73 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f   sizeof(ifNullRo
1c600 77 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  w));.          i
1c610 66 4e 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b  fNullRow.op = TK
1c620 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20  _IF_NULL_ROW;.  
1c630 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f          ifNullRo
1c640 77 2e 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b  w.pLeft = pCopy;
1c650 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c  .          ifNul
1c660 6c 52 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53  lRow.iTable = pS
1c670 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1c680 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 70 79  .          pCopy
1c690 20 3d 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20   = &ifNullRow;. 
1c6a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c6b0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1c6c0 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79  xprDup(db, pCopy
1c6d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
1c6e0 28 20 70 4e 65 77 20 26 26 20 70 53 75 62 73 74  ( pNew && pSubst
1c6f0 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  ->isLeftJoin ){.
1c700 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
1c710 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  tProperty(pNew, 
1c720 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20  EP_CanBeNull);. 
1c730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c740 20 69 66 28 20 70 4e 65 77 20 26 26 20 45 78 70   if( pNew && Exp
1c750 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c760 70 72 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  pr,EP_FromJoin) 
1c770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
1c780 77 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  w->iRightJoinTab
1c790 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67  le = pExpr->iRig
1c7a0 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20  htJoinTable;.   
1c7b0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
1c7c0 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
1c7d0 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20  FromJoin);.     
1c7e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1c7f0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1c800 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
1c810 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
1c820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1c840 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46  pExpr->op==TK_IF
1c850 5f 4e 55 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78  _NULL_ROW && pEx
1c860 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62  pr->iTable==pSub
1c870 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20  st->iTable ){.  
1c880 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
1c890 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77  e = pSubst->iNew
1c8a0 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Table;.    }.   
1c8b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
1c8c0 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1c8d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1c8e0 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  .    pExpr->pRig
1c8f0 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ht = substExpr(p
1c900 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52  Subst, pExpr->pR
1c910 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45  ight);.    if( E
1c920 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c930 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1c940 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
1c950 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c  stSelect(pSubst,
1c960 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1c970 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 1);.    }else
1c980 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1c990 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 45  rList(pSubst, pE
1c9a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
1c9b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c9c0 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
1c9d0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1c9e0 4c 69 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e  List(.  SubstCon
1c9f0 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a  text *pSubst, /*
1ca00 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1ca10 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1ca20 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1ca30 70 4c 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c  pList       /* L
1ca40 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
1ca50 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1ca60 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
1ca70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1ca80 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1ca90 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1caa0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1cab0 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  i++){.    pList-
1cac0 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75  >a[i].pExpr = su
1cad0 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1cae0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1caf0 72 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  r);.  }.}.static
1cb00 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1cb10 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78  t(.  SubstContex
1cb20 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65  t *pSubst, /* De
1cb30 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1cb40 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1cb50 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1cb60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
1cb70 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1cb80 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1cb90 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
1cba0 20 69 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20   int doPrior    
1cbb0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62         /* Do sub
1cbc0 73 74 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70  stitutes on p->p
1cbd0 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a  Prior too */.){.
1cbe0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1cbf0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1cc00 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1cc10 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70   int i;.  if( !p
1cc20 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b   ) return;.  do{
1cc30 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1cc40 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45  st(pSubst, p->pE
1cc50 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
1cc60 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1cc70 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20   p->pGroupBy);. 
1cc80 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1cc90 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64  (pSubst, p->pOrd
1cca0 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48  erBy);.    p->pH
1ccb0 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1ccc0 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61  r(pSubst, p->pHa
1ccd0 76 69 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57  ving);.    p->pW
1cce0 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1ccf0 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65  (pSubst, p->pWhe
1cd00 72 65 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  re);.    pSrc = 
1cd10 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73  p->pSrc;.    ass
1cd20 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
1cd30 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
1cd40 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63  nSrc, pItem=pSrc
1cd50 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
1cd60 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
1cd70 75 62 73 74 53 65 6c 65 63 74 28 70 53 75 62 73  ubstSelect(pSubs
1cd80 74 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  t, pItem->pSelec
1cd90 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
1cda0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
1cdb0 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
1cdc0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1cdd0 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e  ubst, pItem->u1.
1cde0 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20  pFuncArg);.     
1cdf0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
1ce00 65 28 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70  e( doPrior && (p
1ce10 20 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30   = p->pPrior)!=0
1ce20 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   );.}.#endif /* 
1ce30 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1ce40 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1ce50 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1ce60 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1ce70 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1ce80 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1ce90 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1cea0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1ceb0 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
1cec0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1ced0 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
1cee0 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
1cef0 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
1cf00 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
1cf10 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
1cf20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
1cf30 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
1cf40 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
1cf50 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
1cf60 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
1cf70 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
1cf80 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1cf90 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
1cfa0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1cfb0 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
1cfc0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1cfd0 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
1cfe0 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
1cff0 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
1d000 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
1d010 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
1d020 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
1d030 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
1d040 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1d050 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
1d060 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
1d070 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
1d080 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
1d090 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
1d0a0 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
1d0b0 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
1d0c0 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
1d0d0 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
1d0e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1d0f0 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
1d100 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
1d110 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
1d120 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1d130 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
1d140 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1d150 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
1d160 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
1d170 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
1d180 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
1d190 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
1d1a0 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
1d1b0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
1d1c0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1d1d0 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
1d1e0 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
1d1f0 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
1d200 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74  this simplificat
1d210 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
1d220 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
1d230 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
1d240 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
1d250 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
1d260 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
1d270 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
1d280 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
1d290 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
1d2a0 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
1d2b0 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
1d2c0 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
1d2d0 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
1d2e0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1d2f0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1d300 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
1d310 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1d320 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1d330 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
1d340 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
1d350 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1d360 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1d370 67 61 74 65 20 6f 72 20 28 32 61 29 20 74 68 65  gate or (2a) the
1d380 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1d390 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20  not a join.**   
1d3a0 20 20 20 20 20 61 6e 64 20 28 32 62 29 20 74 68       and (2b) th
1d3b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1d3c0 65 73 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75  es not use subqu
1d3d0 65 72 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e  eries other than
1d3e0 20 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20   the one.**     
1d3f0 20 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73     FROM-clause s
1d400 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20  ubquery that is 
1d410 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
1d420 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62  flattening.  (2b
1d430 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75   is.**        du
1d440 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37  e to ticket [2f7
1d450 31 37 30 64 37 33 62 66 39 61 62 66 38 30 5d 20  170d73bf9abf80] 
1d460 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e  from 2015-02-09.
1d470 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54  ).**.**   (3)  T
1d480 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1d490 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  ot the right ope
1d4a0 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
1d4b0 4f 49 4e 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72  OIN.**        or
1d4c0 20 28 61 29 20 74 68 65 20 73 75 62 71 75 65 72   (a) the subquer
1d4d0 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  y is not itself 
1d4e0 61 20 6a 6f 69 6e 20 61 6e 64 20 28 62 29 20 74  a join and (b) t
1d4f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  he FROM clause.*
1d500 2a 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20  *        of the 
1d510 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1d520 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 69 72 74  t contain a virt
1d530 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 28 63  ual table and (c
1d540 29 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  ) the .**       
1d550 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1d560 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1d570 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ..**.**   (4)  T
1d580 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1d590 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  ot DISTINCT..**.
1d5a0 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65  **  (**)  At one
1d5b0 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69   point restricti
1d5c0 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20  ons (4) and (5) 
1d5d0 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74  defined a subset
1d5e0 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20   of DISTINCT.** 
1d5f0 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69         sub-queri
1d600 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63  es that were exc
1d610 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20  luded from this 
1d620 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65  optimization. Re
1d630 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  striction .**   
1d640 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e       (4) has sin
1d650 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64  ce been expanded
1d660 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20   to exclude all 
1d670 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72  DISTINCT subquer
1d680 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  ies..**.**   (6)
1d690 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1d6a0 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
1d6b0 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
1d6c0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1d6d0 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
1d6e0 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
1d6f0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
1d700 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
1d710 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75  .  TODO:  For su
1d720 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74  bqueries without
1d730 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f  .**        A FRO
1d740 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64  M clause, consid
1d750 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d  er adding a FROM
1d760 20 63 6c 61 75 73 65 20 77 69 74 68 20 74 68 65   clause with the
1d770 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20   special.**     
1d780 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f     table sqlite_
1d790 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73  once that consis
1d7a0 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72  ts of a single r
1d7b0 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  ow containing a.
1d7c0 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65  **        single
1d7d0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   NULL..**.**   (
1d7e0 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
1d7f0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1d800 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1d810 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
1d820 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
1d830 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1d840 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1d850 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1d860 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1d870 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
1d880 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
1d890 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f  (**)  Restrictio
1d8a0 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76  n (10) was remov
1d8b0 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65  ed from the code
1d8c0 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62   on 2005-02-05 b
1d8d0 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
1d8e0 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69  accidently carri
1d8f0 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66  ed the comment f
1d900 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31  orward until 201
1d910 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e  4-09-15.  Origin
1d920 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 65 78  al.**        tex
1d930 74 3a 20 22 54 68 65 20 73 75 62 71 75 65 72 79  t: "The subquery
1d940 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1d950 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1d960 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20  outer query .** 
1d970 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20         does not 
1d980 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a  use LIMIT.".**.*
1d990 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
1d9a0 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
1d9b0 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1d9c0 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
1d9d0 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
1d9e0 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d  **  (**)  Not im
1d9f0 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
1da00 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
1da10 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
1da20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
1da30 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
1da40 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
1da50 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
1da60 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
1da70 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1da80 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
1da90 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
1daa0 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
1dab0 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
1dac0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
1dad0 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  FFSET..**.**  (1
1dae0 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
1daf0 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
1db00 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
1db10 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
1db20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
1db30 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
1db40 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  IMIT clause..** 
1db50 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b         (See tick
1db60 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63  et #2339 and tic
1db70 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d  ket [02a8e81d44]
1db80 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20  )..**.**  (16)  
1db90 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1dba0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1dbb0 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75  ate or the subqu
1dbc0 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20  ery does.**     
1dbd0 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f     not contain O
1dbe0 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
1dbf0 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
1dc00 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
1dc10 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
1dc20 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
1dc30 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
1dc40 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
1dc50 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20  *.**  (17)  The 
1dc60 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
1dc70 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1dc80 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55  ct, or it is a U
1dc90 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20  NION ALL .**    
1dca0 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61      compound cla
1dcb0 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69  use made up enti
1dcc0 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72  rely of non-aggr
1dcd0 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61  egate queries, a
1dce0 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  nd .**        th
1dcf0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a  e parent query:.
1dd00 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  **.**          *
1dd10 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70   is not itself p
1dd20 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
1dd30 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20  d select,.**    
1dd40 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
1dd50 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44  n aggregate or D
1dd60 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61  ISTINCT query, a
1dd70 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  nd.**          *
1dd80 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a   is not a join.*
1dd90 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
1dda0 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
1ddb0 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
1ddc0 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
1ddd0 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
1dde0 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
1ddf0 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
1de00 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
1de10 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
1de20 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
1de30 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
1de40 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72  es.  The subquer
1de50 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79  y cannot use any
1de60 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1de70 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68      operator oth
1de80 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
1de90 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  L because all th
1dea0 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64  e other compound
1deb0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
1dec0 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70  tors have an imp
1ded0 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68  lied DISTINCT wh
1dee0 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ich is disallowe
1def0 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  d by.**        r
1df00 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a  estriction (4)..
1df10 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73  **.**        Als
1df20 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  o, each componen
1df30 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  t of the sub-que
1df40 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74  ry must return t
1df50 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
1df60 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75  *        of resu
1df70 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73  lt columns. This
1df80 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72   is actually a r
1df90 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61  equirement for a
1dfa0 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1dfb0 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61        SELECT sta
1dfc0 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20  tement, but all 
1dfd0 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f  the code here do
1dfe0 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20  es is make sure 
1dff0 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20  that no.**      
1e000 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29    such (illegal)
1e010 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c   sub-query is fl
1e020 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c  attened. The cal
1e030 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20  ler will detect 
1e040 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79  the.**        sy
1e050 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72  ntax error and r
1e060 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64  eturn a detailed
1e070 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
1e080 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
1e090 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1e0a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1e0b0 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
1e0c0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
1e0d0 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66  DER by clause of
1e0e0 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
1e0f0 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
1e100 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
1e110 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
1e120 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
1e130 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73  .**  (19)  The s
1e140 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1e150 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1e160 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1e170 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
1e180 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c   have a WHERE cl
1e190 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30  ause..**.**  (20
1e1a0 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1e1b0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1e1c0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69  d select, then i
1e1d0 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a  t must not use.*
1e1e0 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45  *        an ORDE
1e1f0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69  R BY clause.  Ti
1e200 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20  cket #3773.  We 
1e210 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73  could relax this
1e220 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20   constraint.**  
1e230 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62        somewhat b
1e240 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68  y saying that th
1e250 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  e terms of the O
1e260 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d  RDER BY clause m
1e270 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70  ust.**        ap
1e280 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69  pear as unmodifi
1e290 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ed result column
1e2a0 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
1e2b0 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a  uery.  But we.**
1e2c0 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68          have oth
1e2d0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1e2e0 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c   in mind to deal
1e2f0 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e   with that case.
1e300 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68  .**.**  (21)  Th
1e310 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1e320 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
1e330 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e340 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
1e350 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
1e360 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
1e370 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  46fc])..**.**  (
1e380 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  22)  The subquer
1e390 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  y is not a recur
1e3a0 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  sive CTE..**.** 
1e3b0 20 28 32 33 29 20 20 54 68 65 20 70 61 72 65 6e   (23)  The paren
1e3c0 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  t is not a recur
1e3d0 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65  sive CTE, or the
1e3e0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
1e3f0 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  t a.**        co
1e400 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68  mpound query. Th
1e410 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69  is restriction i
1e420 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66  s because transf
1e430 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  orming the.**   
1e440 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61       parent to a
1e450 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1e460 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64  confuses the cod
1e470 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a  e that handles.*
1e480 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69  *        recursi
1e490 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75  ve queries in mu
1e4a0 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a  ltiSelect()..**.
1e4b0 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20 73 75  **  (24)  The su
1e4c0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
1e4d0 20 61 67 67 72 65 67 61 74 65 20 74 68 61 74 20   aggregate that 
1e4e0 75 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69  uses the built-i
1e4f0 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20  n min() or .**  
1e500 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66        or max() f
1e510 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68  unctions.  (With
1e520 6f 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  out this restric
1e530 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69  tion, a query li
1e540 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53  ke:.**        "S
1e550 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45  ELECT x FROM (SE
1e560 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46  LECT max(y), x F
1e570 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e  ROM t1)" would n
1e580 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a  ot necessarily.*
1e590 2a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  *        return 
1e5a0 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20  the value X for 
1e5b0 77 68 69 63 68 20 59 20 77 61 73 20 6d 61 78 69  which Y was maxi
1e5c0 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49  mal.).**.**.** I
1e5d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
1e5e0 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
1e5f0 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
1e600 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
1e610 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
1e620 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
1e630 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
1e640 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
1e650 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
1e660 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
1e670 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
1e680 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
1e690 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
1e6a0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
1e6b0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1e6c0 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
1e6d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1e6e0 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
1e6f0 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
1e700 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
1e710 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
1e720 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
1e730 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
1e740 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
1e750 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
1e760 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
1e770 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
1e780 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
1e790 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
1e7a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e7b0 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
1e7c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1e7d0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
1e7e0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1e7f0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1e800 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
1e810 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
1e820 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
1e830 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
1e840 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1e850 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
1e860 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
1e870 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
1e880 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
1e890 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
1e8a0 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
1e8b0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1e8c0 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
1e8d0 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
1e8e0 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1e8f0 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1e900 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
1e910 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1e920 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1e930 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
1e940 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
1e950 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
1e960 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
1e970 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
1e980 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
1e990 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
1e9a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
1e9b0 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
1e9c0 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
1e9d0 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
1e9e0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
1e9f0 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
1ea00 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
1ea10 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1ea20 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
1ea30 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1ea40 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1ea50 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
1ea60 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
1ea70 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1ea80 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1ea90 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
1eaa0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1eab0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
1eac0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
1ead0 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
1eae0 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
1eaf0 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
1eb00 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
1eb10 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
1eb20 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
1eb30 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
1eb40 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
1eb50 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
1eb60 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb80 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1eb90 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1ebc0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1ebd0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ebe0 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
1ebf0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
1ec00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ec10 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
1ec20 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1ec30 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1ec40 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
1ec50 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
1ec60 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
1ec70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1ec80 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
1ec90 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
1eca0 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
1ecb0 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ries */.  if( Op
1ecc0 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1ecd0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
1ece0 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20  eryFlattener) ) 
1ecf0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
1ed00 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
1ed10 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
1ed20 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
1ed30 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
1ed40 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
1ed50 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50  ->a[iFrom];.  iP
1ed60 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
1ed70 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75  ->iCursor;.  pSu
1ed80 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
1ed90 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
1eda0 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
1edb0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1edc0 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  ){.    if( isAgg
1edd0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ee00 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
1ee10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
1ee20 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
1ee30 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ee50 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 61 29  Restriction (2a)
1ee60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
1ee70 3e 70 57 68 65 72 65 20 26 26 20 45 78 70 72 48  >pWhere && ExprH
1ee80 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 57  asProperty(p->pW
1ee90 68 65 72 65 2c 45 50 5f 53 75 62 71 75 65 72 79  here,EP_Subquery
1eea0 29 29 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69  )).     || (sqli
1eeb0 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
1eec0 28 70 2d 3e 70 45 4c 69 73 74 29 20 26 20 45 50  (p->pEList) & EP
1eed0 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20  _Subquery)!=0.  
1eee0 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78     || (sqlite3Ex
1eef0 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70  prListFlags(p->p
1ef00 4f 72 64 65 72 42 79 29 20 26 20 45 50 5f 53 75  OrderBy) & EP_Su
1ef10 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20 29  bquery)!=0.    )
1ef20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1ef30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ef60 73 74 72 69 63 74 69 6f 6e 20 28 32 62 29 20 20  striction (2b)  
1ef70 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  */.    }.  }..  
1ef80 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
1ef90 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1efa0 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
1efb0 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
1efc0 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
1efd0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
1efe0 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
1eff0 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
1f000 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
1f010 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  ressions, we all
1f020 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
1f030 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
1f040 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
1f050 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
1f060 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
1f070 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
1f080 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
1f090 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
1f0a0 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
1f0b0 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
1f0c0 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
1f0d0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
1f0e0 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
1f0f0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
1f100 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
1f110 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f130 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
1f140 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1f150 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72  >pOffset ) retur
1f160 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f180 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
1f190 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73  ) */.  if( (p->s
1f1a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d  elFlags & SF_Com
1f1b0 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75  pound)!=0 && pSu
1f1c0 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
1f1d0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f200 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f210 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
1f220 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
1f230 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
1f240 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1f260 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
1f270 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1f280 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1f290 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
1f2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1f2b0 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f  triction (5)  */
1f2c0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1f2d0 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
1f2e0 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
1f2f0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1f300 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1f310 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
1f320 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
1f330 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1f340 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73  istinct)!=0 && s
1f350 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1f360 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1f370 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1f380 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
1f390 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
1f3a0 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
1f3b0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65  derBy ){.     re
1f3c0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f400 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (11) */.  }.  i
1f410 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62  f( isAgg && pSub
1f420 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
1f430 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f440 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f450 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69  tion (16) */.  i
1f460 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f470 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  && p->pWhere ) r
1f480 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f490 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f4a0 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69  tion (19) */.  i
1f4b0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f4c0 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
1f4d0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1f4e0 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
1f4f0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1f500 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20  estriction (21) 
1f510 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  */.  }.  testcas
1f520 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  e( pSub->selFlag
1f530 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1f540 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1f550 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1f560 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b   SF_MinMaxAgg );
1f570 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1f580 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
1f590 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41  rsive|SF_MinMaxA
1f5a0 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  gg) ){.    retur
1f5b0 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74  n 0; /* Restrict
1f5c0 69 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32  ions (22) and (2
1f5d0 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  4) */.  }.  if( 
1f5e0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f5f0 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
1f600 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1f610 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1f620 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33   Restriction (23
1f630 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ) */.  }..  /*. 
1f640 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
1f650 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1f660 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1f670 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
1f680 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1f690 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1f6a0 6e 20 69 74 73 65 6c 66 2e 20 20 45 78 61 6d 70  n itself.  Examp
1f6b0 6c 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  le of why this i
1f6c0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1f6d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1f6e0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1f6f0 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
1f700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1f710 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1f720 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1f730 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1f740 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1f750 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
1f760 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
1f770 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
1f780 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
1f790 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
1f7a0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
1f7b0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1f7c0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
1f7d0 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 0a 20  then the outer. 
1f7e0 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f 74   ** query cannot
1f7f0 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65   be an aggregate
1f800 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 61 72  .  This is an ar
1f810 74 69 66 61 63 74 20 6f 66 20 74 68 65 20 77 61  tifact of the wa
1f820 79 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a  y aggregates.  *
1f830 2a 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  * are processed 
1f840 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65  - there is no me
1f850 63 68 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72  chanism to deter
1f860 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 45 46 54  mine if the LEFT
1f870 20 4a 4f 49 4e 0a 20 20 2a 2a 20 74 61 62 6c 65   JOIN.  ** table
1f880 20 73 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e   should be all-N
1f890 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ULL..  **.  ** S
1f8a0 65 65 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20  ee also tickets 
1f8b0 23 33 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20  #306, #350, and 
1f8c0 23 33 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3300..  */.  if
1f8d0 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e  ( (pSubitem->fg.
1f8e0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1f8f0 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  TER)!=0 ){.    i
1f900 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20  sLeftJoin = 1;. 
1f910 20 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e     if( pSubSrc->
1f920 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20  nSrc>1 || isAgg 
1f930 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 53 75  || IsVirtual(pSu
1f940 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29  bSrc->a[0].pTab)
1f950 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f960 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69   0; /* Restricti
1f970 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 20 20 7d 0a  on (3) */.    }.
1f980 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1f990 45 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f  E_EXTRA_IFNULLRO
1f9a0 57 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46 72  W.  else if( iFr
1f9b0 6f 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20 29  om>0 && !isAgg )
1f9c0 7b 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67  {.    /* Setting
1f9d0 20 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d   isLeftJoin to -
1f9e0 31 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75  1 causes OP_IfNu
1f9f0 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f  llRow opcodes to
1fa00 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f   be generated fo
1fa10 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72  r.    ** every r
1fa20 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
1fa30 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72  result column fr
1fa40 6f 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20 61  om subquery in a
1fa50 20 6a 6f 69 6e 2c 20 65 76 65 6e 20 74 68 6f 75   join, even thou
1fa60 67 68 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61  gh.    ** they a
1fa70 72 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  re not necessary
1fa80 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72  .  This will str
1fa90 65 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f  ess-test the OP_
1faa0 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65  IfNullRow opcode
1fab0 2e 20 2a 2f 0a 20 20 20 20 69 73 4c 65 66 74 4a  . */.    isLeftJ
1fac0 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65  oin = -1;.  }.#e
1fad0 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 73 74 72  ndif..  /* Restr
1fae0 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68  iction 17: If th
1faf0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1fb00 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1fb10 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
1fb20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
1fb30 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1fb40 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
1fb50 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
1fb60 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
1fb70 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
1fb80 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1fb90 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
1fba0 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
1fbb0 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
1fbc0 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
1fbd0 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
1fbe0 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
1fbf0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1fc00 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1fc10 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a  Restriction 20 *
1fc20 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
1fc30 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
1fc40 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1fc50 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
1fc60 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
1fc70 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1fc80 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
1fc90 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
1fca0 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
1fcb0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1fcc0 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
1fcd0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1fce0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1fcf0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
1fd00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fd10 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1fd20 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1fd30 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1fd40 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
1fd50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fd60 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
1fd70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fd80 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
1fd90 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr==pSub1->pELis
1fda0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1fdb0 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
1fdc0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1fdd0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1fde0 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  te))!=0.       |
1fdf0 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  | (pSub1->pPrior
1fe00 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54   && pSub1->op!=T
1fe10 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c  K_ALL) .       |
1fe20 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  | pSub1->pSrc->n
1fe30 53 72 63 3c 31 0a 20 20 20 20 20 20 29 7b 0a 20  Src<1.      ){. 
1fe40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1fe50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1fe60 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
1fe70 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
1fe80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1fe90 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f  striction 18. */
1fea0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
1feb0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
1fec0 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
1fed0 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
1fee0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
1fef0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1ff00 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
1ff10 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
1ff20 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
1ff30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ff40 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66    }..  /***** If
1ff50 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1ff60 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
1ff70 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
1ff80 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52  ****/.  SELECTTR
1ff90 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
1ffa0 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66  "flatten %s.%p f
1ffb0 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a  rom term %d\n",.
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d     pSub->zSelNam
1ffe0 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29  e, pSub, iFrom))
1fff0 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a  ;..  /* Authoriz
20000 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  e the subquery *
20010 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  /.  pParse->zAut
20020 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
20030 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45  tem->zName;.  TE
20040 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69  STONLY(i =) sqli
20050 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
20060 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
20070 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
20080 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c  testcase( i==SQL
20090 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50  ITE_DENY );.  pP
200a0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
200b0 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
200c0 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
200d0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
200e0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
200f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
20100 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
20110 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
20120 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
20130 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
20140 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
20150 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
20160 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
20170 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
20180 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
20190 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
201a0 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
201b0 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
201c0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
201d0 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
201e0 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
201f0 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
20200 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
20210 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
20220 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
20230 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
20240 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
20250 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
20260 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
20270 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
20280 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
20290 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
202a0 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
202b0 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
202c0 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
202d0 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
202e0 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
202f0 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
20300 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
20310 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
20320 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
20330 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
20340 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
20350 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
20360 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
20370 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
20380 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
20390 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
203a0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
203b0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
203c0 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
203d0 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
203e0 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
203f0 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
20400 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
20410 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
20420 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
20430 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
20440 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
20450 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
20460 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
20470 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
20480 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
20490 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
204a0 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
204b0 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
204c0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
204d0 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
204e0 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
204f0 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
20500 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
20510 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
20520 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
20530 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
20540 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
20550 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
20560 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
20570 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
20580 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
20590 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
205a0 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66  t;.    Expr *pOf
205b0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
205c0 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
205d0 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
205e0 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
205f0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
20600 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
20610 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
20620 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
20630 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
20640 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
20650 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
20660 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, p, 0);.    sq
20670 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
20680 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a  me(pNew, pSub->z
20690 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  SelName);.    p-
206a0 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
206b0 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  et;.    p->pLimi
206c0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
206d0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
206e0 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
206f0 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
20700 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
20710 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
20720 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  ){.      p->pPri
20730 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
20740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
20750 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
20760 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ior;.      if( p
20770 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e  Prior ) pPrior->
20780 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
20790 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
207a0 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  = p;.      p->pP
207b0 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
207c0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32     SELECTTRACE(2
207d0 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20  ,pParse,p,.     
207e0 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73      ("compound-s
207f0 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65  ubquery flattene
20800 72 20 63 72 65 61 74 65 73 20 25 73 2e 25 70 20  r creates %s.%p 
20810 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20  as peer\n",.    
20820 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e       pNew->zSelN
20830 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20  ame, pNew));.   
20840 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
20850 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
20860 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
20870 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69  * Begin flatteni
20880 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20  ng the iFrom-th 
20890 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
208a0 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69  M clause .  ** i
208b0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
208c0 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  y..  */.  pSub =
208d0 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65   pSub1 = pSubite
208e0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  m->pSelect;..  /
208f0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61  * Delete the tra
20900 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
20910 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
20920 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
20930 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  subquery.  */.  
20940 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20950 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  , pSubitem->zDat
20960 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  abase);.  sqlite
20970 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
20980 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
20990 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
209a0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  , pSubitem->zAli
209b0 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  as);.  pSubitem-
209c0 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
209d0 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d    pSubitem->zNam
209e0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
209f0 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->zAlias = 0;. 
20a00 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
20a10 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65  ct = 0;..  /* De
20a20 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  fer deleting the
20a30 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73   Table object as
20a40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
20a50 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
20a60 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72  until code gener
20a70 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ation is.  ** co
20a80 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68  mplete, since th
20a90 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78  ere may still ex
20aa0 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e  ist Expr.pTab en
20ab0 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  tries that.  ** 
20ac0 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62  refer to the sub
20ad0 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72  query even after
20ae0 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69   flattening.  Ti
20af0 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a  cket #3346..  **
20b00 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e  .  ** pSubitem->
20b10 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e  pTab is always n
20b20 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20  on-NULL by test 
20b30 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64  restrictions and
20b40 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20   tests above..  
20b50 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
20b60 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d  pSubitem->pTab!=
20b70 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  0) ){.    Table 
20b80 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75  *pTabToDel = pSu
20b90 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bitem->pTab;.   
20ba0 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e   if( pTabToDel->
20bb0 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20  nTabRef==1 ){.  
20bc0 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c      Parse *pTopl
20bd0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
20be0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
20bf0 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54  se);.      pTabT
20c00 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69  oDel->pNextZombi
20c10 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70  e = pToplevel->p
20c20 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20  ZombieTab;.     
20c30 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
20c40 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44  bieTab = pTabToD
20c50 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  el;.    }else{. 
20c60 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
20c70 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d  nTabRef--;.    }
20c80 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
20c90 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Tab = 0;.  }..  
20ca0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
20cb0 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
20cc0 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  for each term in
20cd0 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
20ce0 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65  uery.  ** flatte
20cf0 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62  ning (as describ
20d00 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77  ed above).  If w
20d10 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69  e are doing a di
20d20 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a  fferent kind.  *
20d30 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * of flattening 
20d40 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f  - a flattening o
20d50 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70  ther than a comp
20d60 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
20d70 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20  attening -.  ** 
20d80 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f  then this loop o
20d90 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20  nly runs once.. 
20da0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
20db0 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20  op moves all of 
20dc0 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
20dd0 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
20de0 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
20df0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
20e00 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
20e10 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
20e20 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
20e30 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
20e40 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
20e50 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
20e60 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
20e70 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
20e80 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
20e90 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
20ea0 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
20eb0 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
20ec0 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
20ed0 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
20ee0 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
20ef0 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
20f00 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
20f10 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
20f20 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
20f30 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
20f40 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
20f50 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
20f60 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
20f70 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65    */.  for(pPare
20f80 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70  nt=p; pParent; p
20f90 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e  Parent=pParent->
20fa0 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75  pPrior, pSub=pSu
20fb0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
20fc0 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20  int nSubSrc;.   
20fd0 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30   u8 jointype = 0
20fe0 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20  ;.    pSubSrc = 
20ff0 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20  pSub->pSrc;     
21000 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
21010 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  f subquery */.  
21020 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62    nSubSrc = pSub
21030 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e  Src->nSrc;  /* N
21040 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
21050 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20  n subquery FROM 
21060 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53  clause */.    pS
21070 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
21080 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
21090 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
210a0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ter query */..  
210b0 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
210c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
210d0 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69  ent==p );  /* Fi
210e0 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68  rst time through
210f0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
21100 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53     jointype = pS
21110 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  ubitem->fg.joint
21120 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ype;.    }else{.
21130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
21140 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20  arent!=p );  /* 
21150 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
21160 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68  nt times through
21170 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
21180 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
21190 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  t->pSrc = sqlite
211a0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
211b0 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
211c0 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29     if( pSrc==0 )
211d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
211e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
211f0 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed );.        br
21200 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
21210 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   }..    /* The s
21220 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73  ubquery uses a s
21230 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68  ingle slot of th
21240 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
21250 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a   the outer.    *
21260 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  * query.  If the
21270 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f   subquery has mo
21280 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d  re than one elem
21290 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ent in its FROM 
212a0 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74  clause,.    ** t
212b0 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f  hen expand the o
212c0 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61  uter query to ma
212d0 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20  ke space for it 
212e0 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d  to hold all elem
212f0 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
21300 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
21310 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
21320 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
21330 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
21340 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54  OM tabA, (SELECT
21350 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75   * FROM sub1, su
21360 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a  b2), tabB;.    *
21370 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74  *.    ** The out
21380 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73  er query has 3 s
21390 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d  lots in its FROM
213a0 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c   clause.  One sl
213b0 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ot of the.    **
213c0 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68   outer query (th
213d0 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69  e middle slot) i
213e0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75  s used by the su
213f0 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78  bquery.  The nex
21400 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f  t.    ** block o
21410 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61  f code will expa
21420 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
21430 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ry FROM clause t
21440 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  o 4 slots..    *
21450 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f  * The middle slo
21460 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f  t is expanded to
21470 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72   two slots in or
21480 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  der to make spac
21490 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  e.    ** for the
214a0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
214b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
214c0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
214d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
214e0 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
214f0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
21500 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74  c = pSrc = sqlit
21510 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
21520 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53  (db, pSrc, nSubS
21530 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20  rc-1,iFrom+1);. 
21540 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
21550 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
21560 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21570 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
21580 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46  * Transfer the F
21590 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
215a0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
215b0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  ry into the.    
215c0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  ** outer query..
215d0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
215e0 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
215f0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
21600 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
21610 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72  b, pSrc->a[i+iFr
21620 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20  om].pUsing);.   
21630 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d     assert( pSrc-
21640 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69  >a[i+iFrom].fg.i
21650 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20  sTabFunc==0 );. 
21660 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
21670 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
21680 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65  >a[i];.      iNe
21690 77 50 61 72 65 6e 74 20 3d 20 70 53 75 62 53 72  wParent = pSubSr
216a0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
216b0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
216c0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
216d0 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
216e0 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
216f0 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
21700 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
21710 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20  jointype;.  .   
21720 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75   /* Now begin su
21730 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75  bstituting subqu
21740 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65  ery result set e
21750 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a  xpressions for .
21760 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
21770 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74  s to the iParent
21780 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
21790 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ery..    ** .   
217a0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
217b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
217c0 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
217d0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
217e0 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
217f0 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
21800 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20  b;.    **   \   
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
21830 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
21840 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f  ____/          /
21850 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f  .    **    \____
21860 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21870 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
21880 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21890 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
218a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c    **.    ** We l
218b0 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70  ook at every exp
218c0 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f  ression in the o
218d0 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65  uter query and e
218e0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
218f0 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20  e.    ** "a" we 
21900 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
21910 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
21920 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
21930 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
21940 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21950 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
21960 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74  ){.      /* At t
21970 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e  his point, any n
21980 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42 79  on-zero iOrderBy
21990 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64 69 63  Col values indic
219a0 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ate that the.   
219b0 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 63     ** ORDER BY c
219c0 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
219d0 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f   is identical to
219e0 20 74 68 65 20 69 4f 72 64 65 72 42 79 43 6f 6c   the iOrderByCol
219f0 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  'th.      ** exp
21a00 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64  ression returned
21a10 20 62 79 20 53 45 4c 45 43 54 20 73 74 61 74 65   by SELECT state
21a20 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e 63 65  ment pSub. Since
21a30 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a 20 20   these values.  
21a40 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65      ** do not ne
21a50 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65 73  cessarily corres
21a60 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  pond to columns 
21a70 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  in SELECT statem
21a80 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20 20 20  ent pParent,.   
21a90 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20     ** zero them 
21aa0 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72 69  before transferi
21ab0 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
21ac0 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  clause..      **
21ad0 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f  .      ** Not do
21ae0 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63 61 75  ing this may cau
21af0 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  se an error if a
21b00 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
21b10 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a   to this.      *
21b20 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  * function attem
21b30 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  pts to flatten a
21b40 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
21b50 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ery into pParent
21b60 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 6f  .      ** (the o
21b70 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63 61 6e  nly way this can
21b80 20 68 61 70 70 65 6e 20 69 73 20 69 66 20 74 68   happen is if th
21b90 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  e compound sub-q
21ba0 75 65 72 79 20 69 73 0a 20 20 20 20 20 20 2a 2a  uery is.      **
21bb0 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20   currently part 
21bc0 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29 2e 20  of pSub->pSrc). 
21bd0 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31 31 61  See ticket [d11a
21be0 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20  6e908f].  */.   
21bf0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
21c00 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
21c10 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 66 6f  rderBy;.      fo
21c20 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
21c30 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
21c40 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
21c50 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
21c60 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rByCol = 0;.    
21c70 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
21c80 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
21c90 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
21ca0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 50  assert( pSub->pP
21cb0 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rior==0 );.     
21cc0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
21cd0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
21ce0 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
21cf0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rBy = 0;.    }. 
21d00 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
21d10 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
21d20 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
21d30 0a 20 20 20 20 69 66 28 20 69 73 4c 65 66 74 4a  .    if( isLeftJ
21d40 6f 69 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  oin>0 ){.      s
21d50 65 74 4a 6f 69 6e 45 78 70 72 28 70 57 68 65 72  etJoinExpr(pWher
21d60 65 2c 20 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a  e, iNewParent);.
21d70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75      }.    if( su
21d80 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
21d90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
21da0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  rent->pHaving==0
21db0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
21dc0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61  t->pHaving = pPa
21dd0 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20  rent->pWhere;.  
21de0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
21df0 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
21e00 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
21e10 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
21e20 70 72 41 6e 64 28 64 62 2c 20 0a 20 20 20 20 20  prAnd(db, .     
21e30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21e40 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48  Dup(db, pSub->pH
21e50 61 76 69 6e 67 2c 20 30 29 2c 20 70 50 61 72 65  aving, 0), pPare
21e60 6e 74 2d 3e 70 48 61 76 69 6e 67 0a 20 20 20 20  nt->pHaving.    
21e70 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
21e80 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  t( pParent->pGro
21e90 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
21ea0 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
21eb0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
21ec0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
21ed0 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a  ->pGroupBy, 0);.
21ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21ef0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
21f00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
21f10 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50  d(db, pWhere, pP
21f20 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a  arent->pWhere);.
21f30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
21f40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
21f50 30 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74  0 ){.      Subst
21f60 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20  Context x;.     
21f70 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
21f80 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
21f90 6c 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20  le = iParent;.  
21fa0 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
21fb0 3d 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20  = iNewParent;.  
21fc0 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e      x.isLeftJoin
21fd0 20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20   = isLeftJoin;. 
21fe0 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20       x.pEList = 
21ff0 70 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  pSub->pEList;.  
22000 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
22010 26 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b  &x, pParent, 0);
22020 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
22030 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
22040 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
22050 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
22060 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
22070 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
22080 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
22090 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
220a0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
220b0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
220c0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
220d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
220e0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
220f0 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
22100 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
22110 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
22120 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
22130 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
22140 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
22150 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
22160 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
22170 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
22180 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
22190 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
221a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
221b0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
221c0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
221d0 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
221e0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
221f0 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
22200 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
22210 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
22220 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
22230 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
22240 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
22250 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
22260 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
22270 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69  (db, pSub1);..#i
22280 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
22290 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
222a0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
222b0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
222c0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
222d0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
222e0 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29   flattening:\n")
222f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
22300 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
22310 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
22320 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  f..  return 1;.}
22330 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
22340 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
22350 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
22360 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22370 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69  T_VIEW) */....#i
22380 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
22390 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
223a0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
223b0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
223c0 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73  *.** Make copies
223d0 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45   of relevant WHE
223e0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
223f0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
22400 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57  ry into.** the W
22410 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73  HERE clause of s
22420 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c  ubquery.  Exampl
22430 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e:.**.**    SELE
22440 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
22450 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
22460 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   y FROM t1) WHER
22470 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
22480 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  **.** Transforme
22490 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  d into:.**.**   
224a0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
224b0 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
224c0 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20  -d AS y FROM t1 
224d0 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d  WHERE a=5 AND c-
224e0 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45  d=10).**     WHE
224f0 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
22500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20  .**.** The hope 
22510 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  is that the term
22520 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
22530 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20  nner query will 
22540 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20  make it more.** 
22550 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
22560 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
22570 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
22580 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  n if:.**.**   (1
22590 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
225a0 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  y is an aggregat
225b0 65 2e 20 20 28 49 6e 20 74 68 61 74 20 63 61 73  e.  (In that cas
225c0 65 2c 20 77 65 27 64 20 72 65 61 6c 6c 79 20 77  e, we'd really w
225d0 61 6e 74 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ant.**       to 
225e0 63 6f 70 79 20 74 68 65 20 6f 75 74 65 72 20 57  copy the outer W
225f0 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d  HERE-clause term
22600 73 20 6f 6e 74 6f 20 74 68 65 20 48 41 56 49 4e  s onto the HAVIN
22610 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 0a  G clause of the.
22620 2a 2a 20 20 20 20 20 20 20 69 6e 6e 65 72 20 71  **       inner q
22630 75 65 72 79 2e 20 20 42 75 74 20 74 68 65 79 20  uery.  But they 
22640 70 72 6f 62 61 62 6c 79 20 77 6f 6e 27 74 20 68  probably won't h
22650 65 6c 70 20 74 68 65 72 65 20 73 6f 20 64 6f 20  elp there so do 
22660 6e 6f 74 20 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a  not bother.).**.
22670 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e  **   (2) The inn
22680 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
22690 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
226a0 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  f a common table
226b0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
226c0 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e  **   (3) The inn
226d0 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c  er query has a L
226e0 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e  IMIT clause (sin
226f0 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  ce the changes t
22700 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20  o the WHERE.**  
22710 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64       close would
22720 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e   change the mean
22730 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54  ing of the LIMIT
22740 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54  )..**.**   (4) T
22750 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
22760 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
22770 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
22780 49 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c 65 72  IN.  (The caller
22790 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f 72 63  .**       enforc
227a0 65 73 20 74 68 69 73 20 72 65 73 74 72 69 63 74  es this restrict
227b0 69 6f 6e 20 73 69 6e 63 65 20 74 68 69 73 20 72  ion since this r
227c0 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
227d0 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20  have enough.**  
227e0 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e       information
227f0 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a   to know.).**.**
22800 20 20 20 28 35 29 20 54 68 65 20 57 48 45 52 45     (5) The WHERE
22810 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
22820 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e  on originates in
22830 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22840 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
22850 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
22860 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
22870 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  if no changes ar
22880 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a  e made and non-z
22890 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f  ero if one or mo
228a0 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  re WHERE clause.
228b0 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75 70  ** terms are dup
228c0 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65  licated into the
228d0 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
228e0 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77  atic int pushDow
228f0 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50  nWhereTerms(.  P
22900 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22910 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
22920 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f  ntext (for mallo
22930 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65  c() and error re
22940 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65  porting) */.  Se
22950 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20  lect *pSubq,    
22960 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
22970 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20  ery whose WHERE 
22980 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20  clause is to be 
22990 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45  augmented */.  E
229a0 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
229b0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
229c0 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
229d0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
229e0 20 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20   int iCursor    
229f0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
22a00 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73   number of the s
22a10 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  ubquery */.){.  
22a20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
22a30 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 53  t nChng = 0;.  S
22a40 65 6c 65 63 74 20 2a 70 58 3b 20 20 20 20 20 20  elect *pX;      
22a50 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22a60 69 6e 67 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e  ing over compoun
22a70 64 20 53 45 4c 45 43 54 73 20 69 6e 20 70 53 75  d SELECTs in pSu
22a80 62 71 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  bq */.  if( pWhe
22a90 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  re==0 ) return 0
22aa0 3b 0a 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71  ;.  for(pX=pSubq
22ab0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ; pX; pX=pX->pPr
22ac0 69 6f 72 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ior){.    if( (p
22ad0 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  X->selFlags & (S
22ae0 46 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f 52  F_Aggregate|SF_R
22af0 65 63 75 72 73 69 76 65 29 29 21 3d 30 20 29 7b  ecursive))!=0 ){
22b00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22b10 20 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   pX->selFlags & 
22b20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
22b30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22b40 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  pX->selFlags & S
22b50 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20  F_Recursive );. 
22b60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
22b70 58 21 3d 70 53 75 62 71 20 29 3b 0a 20 20 20 20  X!=pSubq );.    
22b80 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
22b90 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20  estrictions (1) 
22ba0 61 6e 64 20 28 32 29 20 2a 2f 0a 20 20 20 20 7d  and (2) */.    }
22bb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71  .  }.  if( pSubq
22bc0 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20  ->pLimit!=0 ){. 
22bd0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
22be0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20  restriction (3) 
22bf0 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
22c00 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
22c10 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20  ND ){.    nChng 
22c20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  += pushDownWhere
22c30 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53  Terms(pParse, pS
22c40 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69  ubq, pWhere->pRi
22c50 67 68 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20  ght, iCursor);. 
22c60 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65     pWhere = pWhe
22c70 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20  re->pLeft;.  }. 
22c80 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
22c90 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46  erty(pWhere,EP_F
22ca0 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
22cb0 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
22cc0 69 6f 6e 20 35 20 2a 2f 0a 20 20 69 66 28 20 73  ion 5 */.  if( s
22cd0 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
22ce0 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65  eConstant(pWhere
22cf0 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  , iCursor) ){.  
22d00 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77    nChng++;.    w
22d10 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20  hile( pSubq ){. 
22d20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78       SubstContex
22d30 74 20 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  t x;.      pNew 
22d40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
22d50 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68  (pParse->db, pWh
22d60 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 78  ere, 0);.      x
22d70 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
22d80 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65  ;.      x.iTable
22d90 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20   = iCursor;.    
22da0 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20    x.iNewTable = 
22db0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78  iCursor;.      x
22dc0 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b  .isLeftJoin = 0;
22dd0 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20  .      x.pEList 
22de0 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b  = pSubq->pEList;
22df0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75  .      pNew = su
22e00 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77  bstExpr(&x, pNew
22e10 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e  );.      pSubq->
22e20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
22e30 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
22e40 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72  db, pSubq->pWher
22e50 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  e, pNew);.      
22e60 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70  pSubq = pSubq->p
22e70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Prior;.    }.  }
22e80 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b  .  return nChng;
22e90 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
22ea0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22eb0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
22ec0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
22ed0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
22ee0 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65  .** Based on the
22ef0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
22f00 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
22f10 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
22f20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
22f30 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63  ument, this func
22f40 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74  tion checks if t
22f50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
22f60 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
22f70 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74  * the query cont
22f80 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67  ains just a sing
22f90 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  le aggregate fun
22fa0 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74  ction,.**    * t
22fb0 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
22fc0 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20  ction is either 
22fd0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20  min() or max(), 
22fe0 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  and.**    * the 
22ff0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
23000 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
23010 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
23020 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  alue..**.** If a
23030 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
23040 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57  are true, then W
23050 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
23060 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
23070 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75  Y_MAX.** is retu
23080 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69  rned as appropri
23090 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69  ate. Also, *ppMi
230a0 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70  nMax is set to p
230b0 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20  oint to the .** 
230c0 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74  list of argument
230d0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
230e0 61 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65  aggregate before
230f0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
23100 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e  * Or, if the con
23110 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72  ditions above ar
23120 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69  e not met, *ppMi
23130 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30  nMax is set to 0
23140 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52   and.** WHERE_OR
23150 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20  DERBY_NORMAL is 
23160 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
23170 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65  tic u8 minMaxQue
23180 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  ry(AggInfo *pAgg
23190 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a  Info, ExprList *
231a0 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e  *ppMinMax){.  in
231b0 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f  t eRet = WHERE_O
231c0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20  RDERBY_NORMAL;  
231d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
231e0 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70  n value */..  *p
231f0 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69  pMinMax = 0;.  i
23200 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  f( pAggInfo->nFu
23210 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70  nc==1 ){.    Exp
23220 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49  r *pExpr = pAggI
23230 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45  nfo->aFunc[0].pE
23240 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74  xpr; /* Aggregat
23250 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
23260 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
23270 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
23280 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67  ist;      /* Arg
23290 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75  uments to agg fu
232a0 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61  nction */..    a
232b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
232c0 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
232d0 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  N );.    if( pEL
232e0 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
232f0 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73  Expr==1 && pELis
23300 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
23310 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
23320 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
23330 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45  char *zFunc = pE
23340 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
23350 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
23360 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
23370 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
23380 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
23390 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20  _ORDERBY_MIN;.  
233a0 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
233b0 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
233c0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
233d0 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
233e0 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
233f0 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52       eRet = WHER
23400 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
23410 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78         *ppMinMax
23420 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20   = pEList;.     
23430 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
23440 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61  assert( *ppMinMa
23450 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d  x==0 || (*ppMinM
23460 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ax)->nExpr==1 );
23470 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a  .  return eRet;.
23480 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
23490 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
234a0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
234b0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
234c0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
234d0 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  ..** The second 
234e0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
234f0 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65  associated aggre
23500 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74  gate-info object
23510 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
23520 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65  ion tests if the
23530 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68   SELECT is of th
23540 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
23550 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
23560 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a  FROM <tbl>.**.**
23570 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20   where table is 
23580 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
23590 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65  , not a sub-sele
235a0 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74  ct or view. If t
235b0 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73  he query.** does
235c0 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74   match this patt
235d0 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ern, then a poin
235e0 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ter to the Table
235f0 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
23600 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73  ting.** <tbl> is
23610 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
23620 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
23630 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  ned..*/.static T
23640 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f  able *isSimpleCo
23650 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41  unt(Select *p, A
23660 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
23670 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
23680 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  ;.  Expr *pExpr;
23690 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  ..  assert( !p->
236a0 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69  pGroupBy );..  i
236b0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20  f( p->pWhere || 
236c0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
236d0 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53  !=1 .   || p->pS
236e0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70  rc->nSrc!=1 || p
236f0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
23700 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65  lect.  ){.    re
23710 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
23720 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
23730 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72  0].pTab;.  pExpr
23740 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
23750 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  0].pExpr;.  asse
23760 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61  rt( pTab && !pTa
23770 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45  b->pSelect && pE
23780 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73  xpr );..  if( Is
23790 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
237a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
237b0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
237c0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
237d0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56  urn 0;.  if( NEV
237e0 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  ER(pAggInfo->nFu
237f0 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  nc==0) ) return 
23800 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e  0;.  if( (pAggIn
23810 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75  fo->aFunc[0].pFu
23820 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51  nc->funcFlags&SQ
23830 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29  LITE_FUNC_COUNT)
23840 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
23850 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
23860 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29  gs&EP_Distinct )
23870 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65   return 0;..  re
23880 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
23890 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63  .** If the sourc
238a0 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73  e-list item pass
238b0 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
238c0 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20  t was augmented 
238d0 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58  with an.** INDEX
238e0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
238f0 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65  en try to locate
23900 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69   the specified i
23910 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a  ndex. If there.*
23920 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61  * was such a cla
23930 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  use and the name
23940 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62  d index cannot b
23950 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
23960 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
23970 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72   and leave an er
23980 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f  ror in pParse. O
23990 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61  therwise, popula
239a0 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49  te .** pFrom->pI
239b0 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20  ndex and return 
239c0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
239d0 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  t sqlite3Indexed
239e0 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a  ByLookup(Parse *
239f0 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
23a00 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
23a10 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
23a20 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d  ->pTab && pFrom-
23a30 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
23a40 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
23a50 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
23a60 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64  ;.    char *zInd
23a70 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e  exedBy = pFrom->
23a80 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20  u1.zIndexedBy;. 
23a90 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
23aa0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
23ab0 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20  b->pIndex; .    
23ac0 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69      pIdx && sqli
23ad0 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d  te3StrICmp(pIdx-
23ae0 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64  >zName, zIndexed
23af0 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49  By); .        pI
23b00 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20  dx=pIdx->pNext. 
23b10 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70     );.    if( !p
23b20 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Idx ){.      sql
23b30 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23b40 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
23b50 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78  dex: %s", zIndex
23b60 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  edBy, 0);.      
23b70 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
23b80 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  ema = 1;.      r
23b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
23ba0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OR;.    }.    pF
23bb0 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20  rom->pIBIndex = 
23bc0 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pIdx;.  }.  retu
23bd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23be0 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d  /*.** Detect com
23bf0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
23c00 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65  tements that use
23c10 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
23c20 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20  use with .** an 
23c30 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c  alternative coll
23c40 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
23c50 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
23c60 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
23c70 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
23c80 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e  OM t2 ORDER BY .
23c90 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
23ca0 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65  .** These are re
23cb0 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62  written as a sub
23cc0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
23cd0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
23ce0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
23cf0 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
23d00 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20  ... FROM t2).** 
23d10 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e      ORDER BY ...
23d20 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
23d30 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72  ** This transfor
23d40 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  mation is necess
23d50 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20  ary because the 
23d60 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
23d70 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  By() routine.** 
23d80 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72  above that gener
23d90 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
23da0 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  r a compound SEL
23db0 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  ECT with an ORDE
23dc0 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75  R BY clause.** u
23dd0 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f  ses a merge algo
23de0 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69  rithm that requi
23df0 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  res the same col
23e00 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
23e10 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  on the.** result
23e20 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74   columns as on t
23e30 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
23e40 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a  se.  See ticket.
23e50 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71  ** http://www.sq
23e60 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66  lite.org/src/inf
23e70 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a  o/6709574d2a.**.
23e80 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72  ** This transfor
23e90 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e  mation is only n
23ea0 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54  eeded for EXCEPT
23eb0 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64  , INTERSECT, and
23ec0 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55   UNION..** The U
23ed0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
23ee0 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74  r works fine wit
23ef0 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  h multiSelectOrd
23f00 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e  erBy() even when
23f10 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f  .** there are CO
23f20 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74  LLATE terms in t
23f30 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a  he ORDER BY..*/.
23f40 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65  static int conve
23f50 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74  rtCompoundSelect
23f60 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65  ToSubquery(Walke
23f70 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
23f80 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  ct *p){.  int i;
23f90 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
23fa0 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20  .  Select *pX;. 
23fb0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
23fc0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23fd0 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69  item *a;.  SrcLi
23fe0 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50  st *pNewSrc;.  P
23ff0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
24000 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20  Token dummy;..  
24010 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  if( p->pPrior==0
24020 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
24030 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d  ntinue;.  if( p-
24040 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72  >pOrderBy==0 ) r
24050 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
24060 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20  ue;.  for(pX=p; 
24070 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54  pX && (pX->op==T
24080 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d  K_ALL || pX->op=
24090 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d  =TK_SELECT); pX=
240a0 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20  pX->pPrior){}.  
240b0 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75  if( pX==0 ) retu
240c0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
240d0 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72  .  a = p->pOrder
240e0 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70  By->a;.  for(i=p
240f0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
24100 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  r-1; i>=0; i--){
24110 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45  .    if( a[i].pE
24120 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
24130 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b  Collate ) break;
24140 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29  .  }.  if( i<0 )
24150 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
24160 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  inue;..  /* If w
24170 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
24180 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  nt, that means t
24190 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  he transformatio
241a0 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  n is required. *
241b0 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
241c0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
241d0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
241e0 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
241f0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
24200 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
24210 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
24220 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
24230 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26  bort;.  memset(&
24240 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66  dummy, 0, sizeof
24250 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77  (dummy));.  pNew
24260 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
24270 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
24280 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c  rm(pParse,0,0,0,
24290 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29  &dummy,pNew,0,0)
242a0 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d  ;.  if( pNewSrc=
242b0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
242c0 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d  Abort;.  *pNew =
242d0 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d   *p;.  p->pSrc =
242e0 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70   pNewSrc;.  p->p
242f0 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
24300 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
24310 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33  arse, 0, sqlite3
24320 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45  Expr(db, TK_ASTE
24330 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e  RISK, 0));.  p->
24340 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
24350 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b    p->pWhere = 0;
24360 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
24370 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  y = 0;.  pNew->p
24380 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e  Having = 0;.  pN
24390 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ew->pOrderBy = 0
243a0 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  ;.  p->pPrior = 
243b0 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  0;.  p->pNext = 
243c0 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20  0;.  p->pWith = 
243d0 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  0;.  p->selFlags
243e0 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64   &= ~SF_Compound
243f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
24400 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
24410 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20  nverted)==0 );. 
24420 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
24430 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  SF_Converted;.  
24440 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50  assert( pNew->pP
24450 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65  rior!=0 );.  pNe
24460 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  w->pPrior->pNext
24470 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d   = pNew;.  pNew-
24480 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
24490 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30  New->pOffset = 0
244a0 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
244b0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
244c0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
244d0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
244e0 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73  e term pFrom has
244f0 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75   table-valued fu
24500 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65  nction.** argume
24510 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73  nts.  If it does
24520 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
24530 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
24540 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  se and return.**
24550 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65   non-zero, since
24560 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c   pFrom is not al
24570 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74 61  lowed to be a ta
24580 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74  ble-valued funct
24590 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
245a0 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  nt cannotBeFunct
245b0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
245c0 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
245d0 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
245e0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e    if( pFrom->fg.
245f0 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
24600 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
24610 28 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69  (pParse, "'%s' i
24620 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e  s not a function
24630 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29  ", pFrom->zName)
24640 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
24650 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
24660 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
24670 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
24680 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20   Argument pWith 
24690 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55  (which may be NU
246a0 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  LL) points to a 
246b0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e  linked list of n
246c0 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63  ested .** WITH c
246d0 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e  ontexts, from in
246e0 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74  ner to outermost
246f0 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  . If the table i
24700 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a  dentified by .**
24710 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
24720 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65  ment pItem is re
24730 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61  ally a common-ta
24740 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28  ble-expression (
24750 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65  CTE) .** then re
24760 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
24770 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69  o the CTE defini
24780 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61  tion for that ta
24790 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a  ble. Otherwise.*
247a0 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  * return NULL..*
247b0 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55  *.** If a non-NU
247c0 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  LL value is retu
247d0 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e  rned, set *ppCon
247e0 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  text to point to
247f0 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a   the With.** obj
24800 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74  ect that the ret
24810 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67  urned CTE belong
24820 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
24830 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72  struct Cte *sear
24840 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a  chWith(.  With *
24850 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20  pWith,          
24860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
24870 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57  rent innermost W
24880 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ITH clause */.  
24890 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
248a0 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20  tem *pItem,     
248b0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  /* FROM clause e
248c0 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76  lement to resolv
248d0 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70  e */.  With **pp
248e0 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
248f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57         /* OUT: W
24900 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72  ITH clause retur
24910 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20  n value belongs 
24920 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  to */.){.  const
24930 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
24940 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
24950 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d  base==0 && (zNam
24960 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  e = pItem->zName
24970 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68  )!=0 ){.    With
24980 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
24990 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f  With; p; p=p->pO
249a0 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74  uter){.      int
249b0 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
249c0 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
249d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
249e0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
249f0 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  Name, p->a[i].zN
24a00 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
24a10 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20       *ppContext 
24a20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = p;.          r
24a30 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a  eturn &p->a[i];.
24a40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24a50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
24a60 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn 0;.}../* Th
24a70 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
24a80 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61   maintains a sta
24a90 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54  ck of active WIT
24aa0 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74  H clauses.** wit
24ab0 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  h the inner-most
24ac0 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69   WITH clause bei
24ad0 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ng at the top of
24ae0 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
24af0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70  * This routine p
24b00 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63  ushes the WITH c
24b10 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20  lause passed as 
24b20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
24b30 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20  ent.** onto the 
24b40 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
24b50 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46  . If argument bF
24b60 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ree is true, the
24b70 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63  n this.** WITH c
24b80 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72  lause will never
24b90 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20   be popped from 
24ba0 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68  the stack. In th
24bb0 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68  is case it.** sh
24bc0 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c  ould be freed al
24bd0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72  ong with the Par
24be0 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74  se object. In ot
24bf0 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a  her cases, when.
24c00 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65  ** bFree==0, the
24c10 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c   With object wil
24c20 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  l be freed along
24c30 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54   with the SELECT
24c40 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77   .** statement w
24c50 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20  ith which it is 
24c60 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76  associated..*/.v
24c70 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50  oid sqlite3WithP
24c80 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
24c90 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  e, With *pWith, 
24ca0 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73  u8 bFree){.  ass
24cb0 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c  ert( bFree==0 ||
24cc0 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d   (pParse->pWith=
24cd0 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57  =0 && pParse->pW
24ce0 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b  ithToFree==0) );
24cf0 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
24d00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
24d10 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68  se->pWith!=pWith
24d20 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70   );.    pWith->p
24d30 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Outer = pParse->
24d40 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
24d50 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
24d60 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20  ;.    if( bFree 
24d70 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54  ) pParse->pWithT
24d80 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20  oFree = pWith;. 
24d90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
24da0 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
24db0 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72   if argument pFr
24dc0 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43  om refers to a C
24dd0 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a  TE declared by .
24de0 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65  ** a WITH clause
24df0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75   on the stack cu
24e00 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e  rrently maintain
24e10 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
24e20 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72  . And,.** if cur
24e30 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
24e40 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69  g a CTE expressi
24e50 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72  on, if it is a r
24e60 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65  ecursive.** refe
24e70 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72  rence to the cur
24e80 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  rent CTE..**.** 
24e90 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69  If pFrom falls i
24ea0 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68  nto either of th
24eb0 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73  e two categories
24ec0 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70   above, pFrom->p
24ed0 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  Tab.** and other
24ee0 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75   fields are popu
24ef0 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  lated accordingl
24f00 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  y. The caller sh
24f10 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70  ould check.** (p
24f20 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74  From->pTab!=0) t
24f30 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
24f40 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63  her or not a suc
24f50 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a  cessful match.**
24f60 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   was found..**.*
24f70 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
24f80 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
24f90 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
24fa0 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
24fb0 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
24fc0 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
24fd0 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72   occur, an error
24fe0 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
24ff0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72  ed in the.** par
25000 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72  ser and some err
25010 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68  or code other th
25020 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  an SQLITE_OK ret
25030 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
25040 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28   int withExpand(
25050 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  .  Walker *pWalk
25060 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72  er, .  struct Sr
25070 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
25080 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  m.){.  Parse *pP
25090 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
250a0 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
250b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
250c0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65  db;.  struct Cte
250d0 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20   *pCte;         
250e0 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64        /* Matched
250f0 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66   CTE (or NULL if
25100 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20   no match) */.  
25110 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20  With *pWith;    
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74  /* WITH clause t
25140 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73  hat pCte belongs
25150 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
25160 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
25170 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65   );..  pCte = se
25180 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d  archWith(pParse-
25190 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26  >pWith, pFrom, &
251a0 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43  pWith);.  if( pC
251b0 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  te ){.    Table 
251c0 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c  *pTab;.    ExprL
251d0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
251e0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
251f0 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74     Select *pLeft
25200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25210 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45   /* Left-most SE
25220 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
25230 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65  /.    int bMayRe
25240 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20  cursive;        
25250 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
25260 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62  ompound joined b
25270 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f  y UNION [ALL] */
25280 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65  .    With *pSave
25290 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  dWith;          
252a0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
252b0 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70  lue of pParse->p
252c0 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  With */..    /* 
252d0 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  If pCte->zCteErr
252e0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20   is non-NULL at 
252f0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
25300 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65   this is an ille
25310 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  gal.    ** recur
25320 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74  sive reference t
25330 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76  o CTE pCte. Leav
25340 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
25350 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
25360 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66      ** early. If
25370 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
25380 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
25390 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  s is not a recur
253a0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  sive reference..
253b0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
253c0 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a  ase, proceed.  *
253d0 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  /.    if( pCte->
253e0 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20  zCteErr ){.     
253f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25400 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a  (pParse, pCte->z
25410 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e  CteErr, pCte->zN
25420 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
25430 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
25440 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
25450 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
25460 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
25470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
25480 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72  RROR;..    asser
25490 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
254a0 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 );.    pFrom->
254b0 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
254c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
254d0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
254e0 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  le));.    if( pT
254f0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
25500 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54  RC_Abort;.    pT
25510 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
25520 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
25530 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
25540 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  up(db, pCte->zNa
25550 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  me);.    pTab->i
25560 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70  PKey = -1;.    p
25570 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
25580 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
25590 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
255a0 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
255b0 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
255c0 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
255d0 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52   | TF_NoVisibleR
255e0 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  owid;.    pFrom-
255f0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
25600 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
25610 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pCte->pSelect, 0
25620 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
25630 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
25640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
25650 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  M_BKPT;.    asse
25660 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
25670 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  ct );..    /* Ch
25680 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61  eck if this is a
25690 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20   recursive CTE. 
256a0 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46  */.    pSel = pF
256b0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
256c0 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20    bMayRecursive 
256d0 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b  = ( pSel->op==TK
256e0 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70  _ALL || pSel->op
256f0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
25700 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
25710 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ive ){.      int
25720 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73   i;.      SrcLis
25730 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d  t *pSrc = pFrom-
25740 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a  >pSelect->pSrc;.
25750 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
25760 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
25770 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
25780 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
25790 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  pItem = &pSrc->a
257a0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
257b0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
257c0 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e==0 .         &
257d0 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  & pItem->zName!=
257e0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30  0 .         && 0
257f0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
25800 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70  (pItem->zName, p
25810 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20  Cte->zName).    
25820 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25830 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d     pItem->pTab =
25840 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
25850 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63   pItem->fg.isRec
25860 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20  ursive = 1;.    
25870 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
25880 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
25890 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
258a0 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b  |= SF_Recursive;
258b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
258c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
258d0 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73   Only one recurs
258e0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73  ive reference is
258f0 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a   permitted. */ .
25900 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54      if( pTab->nT
25910 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20  abRef>2 ){.     
25920 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25930 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  (.          pPar
25940 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  se, "multiple re
25950 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75  ferences to recu
25960 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22  rsive table: %s"
25970 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20  , pCte->zName.  
25980 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74      );.      ret
25990 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
259a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
259b0 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65  rt( pTab->nTabRe
259c0 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e  f==1 || ((pSel->
259d0 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75  selFlags&SF_Recu
259e0 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e  rsive) && pTab->
259f0 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  nTabRef==2 ));..
25a00 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
25a10 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
25a20 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
25a30 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
25a40 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
25a50 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
25a60 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  = pWith;.    if(
25a70 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
25a80 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
25a90 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70  pPrior = pSel->p
25aa0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73  Prior;.      ass
25ab0 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69  ert( pPrior->pWi
25ac0 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  th==0 );.      p
25ad0 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70  Prior->pWith = p
25ae0 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  Sel->pWith;.    
25af0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
25b00 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72  ect(pWalker, pPr
25b10 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69  ior);.      pPri
25b20 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20  or->pWith = 0;. 
25b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25b40 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
25b50 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
25b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
25b70 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
25b80 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66  h;..    for(pLef
25b90 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70  t=pSel; pLeft->p
25ba0 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65  Prior; pLeft=pLe
25bb0 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20  ft->pPrior);.   
25bc0 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d   pEList = pLeft-
25bd0 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  >pEList;.    if(
25be0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a   pCte->pCols ){.
25bf0 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
25c00 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
25c10 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r!=pCte->pCols->
25c20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
25c30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25c40 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
25c50 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73  %s has %d values
25c60 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
25c70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
25c80 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
25c90 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
25ca0 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
25cb0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
25cc0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
25cd0 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20  pSavedWith;.    
25ce0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25cf0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
25d00 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
25d10 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
25d20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43   }..    sqlite3C
25d30 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
25d40 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
25d50 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
25d60 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
25d70 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
25d80 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ive ){.      if(
25d90 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
25da0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
25db0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
25dc0 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69  zCteErr = "multi
25dd0 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65  ple recursive re
25de0 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20  ferences: %s";. 
25df0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25e00 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
25e10 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72  r = "recursive r
25e20 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75  eference in a su
25e30 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20  bquery: %s";.   
25e40 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
25e50 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
25e60 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
25e70 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74   }.    pCte->zCt
25e80 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  eErr = 0;.    pP
25e90 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
25ea0 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20  avedWith;.  }.. 
25eb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25ec0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
25ed0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25ee0 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  _CTE./*.** If th
25ef0 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20  e SELECT passed 
25f00 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
25f10 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73  gument has an as
25f20 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a  sociated WITH .*
25f30 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74  * clause, pop it
25f40 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
25f50 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
25f60 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  f the Parse obje
25f70 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ct..**.** This f
25f80 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
25f90 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61  as the xSelectCa
25fa0 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61  llback2() callba
25fb0 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33  ck by.** sqlite3
25fc0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77  SelectExpand() w
25fd0 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45  hen walking a SE
25fe0 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73  LECT tree to res
25ff0 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  olve table.** na
26000 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52  mes and other FR
26010 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
26020 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ts. .*/.static v
26030 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74  oid selectPopWit
26040 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  h(Walker *pWalke
26050 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
26060 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
26070 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
26080 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
26090 70 57 69 74 68 20 26 26 20 70 2d 3e 70 50 72 69  pWith && p->pPri
260a0 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  or==0 ){.    Wit
260b0 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52  h *pWith = findR
260c0 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
260d0 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74  th;.    if( pWit
260e0 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  h!=0 ){.      as
260f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
26100 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith==pWith );.  
26110 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
26120 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65  h = pWith->pOute
26130 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  r;.    }.  }.}.#
26140 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c  else.#define sel
26150 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e  ectPopWith 0.#en
26160 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
26170 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c  routine is a Wal
26180 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ker callback for
26190 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53   "expanding" a S
261a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
261b0 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20  .** "Expanding" 
261c0 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20  means to do the 
261d0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
261e0 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
261f0 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
26200 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
26210 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
26220 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
26230 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
26240 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
26250 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
26260 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
26270 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
26280 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
26290 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
262a0 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
262b0 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
262c0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
262d0 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
262e0 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
262f0 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
26300 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
26310 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
26320 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
26330 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
26340 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
26350 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
26360 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
26370 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
26380 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
26390 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
263a0 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
263b0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
263c0 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
263d0 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
263e0 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73  ng up the persis
263f0 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
26400 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
26410 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
26420 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
26430 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
26440 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
26450 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
26460 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
26470 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
26480 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
26490 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
264a0 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
264b0 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
264c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
264d0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
264e0 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
264f0 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
26500 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
26510 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
26520 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
26530 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
26540 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
26550 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
26560 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
26570 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
26580 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
26590 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
265a0 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
265b0 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
265c0 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
265d0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
265e0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
265f0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
26600 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
26610 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
26620 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
26630 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
26640 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
26650 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
26660 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  From;.  sqlite3 
26670 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
26680 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70  ;.  Expr *pE, *p
26690 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20  Right, *pExpr;. 
266a0 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20   u16 selFlags = 
266b0 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20  p->selFlags;..  
266c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
266d0 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66  F_Expanded;.  if
266e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
266f0 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed  ){.    retur
26700 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
26710 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
26720 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c  pSrc==0) || (sel
26730 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
26740 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
26750 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
26760 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20  .  }.  pTabList 
26770 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
26780 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
26790 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 74 68 20  .  if( p->pWith 
267a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69  ){.    sqlite3Wi
267b0 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 70  thPush(pParse, p
267c0 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d  ->pWith, 0);.  }
267d0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
267e0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
267f0 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
26800 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
26810 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
26820 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
26830 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
26840 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
26850 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
26860 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
26870 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c  abList);..  /* L
26880 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
26890 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
268a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
268b0 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
268c0 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
268d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
268e0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
268f0 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
26900 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
26910 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
26920 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
26930 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
26940 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
26950 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
26960 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
26970 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
26980 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
26990 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
269a0 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
269b0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65  ( pFrom->fg.isRe
269c0 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46  cursive==0 || pF
269d0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a  rom->pTab!=0 );.
269e0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66      if( pFrom->f
269f0 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 20  g.isRecursive ) 
26a00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
26a10 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
26a20 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  b==0 );.#ifndef 
26a30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
26a40 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61      if( withExpa
26a50 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  nd(pWalker, pFro
26a60 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
26a70 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70  Abort;.    if( p
26a80 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20  From->pTab ) {} 
26a90 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
26aa0 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
26ab0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
26ac0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
26ad0 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
26ae0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
26af0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
26b00 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
26b10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
26b20 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
26b30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
26b40 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
26b50 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
26b60 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ab==0 );.      i
26b70 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  f( sqlite3WalkSe
26b80 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
26b90 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  el) ) return WRC
26ba0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46  _Abort;.      pF
26bb0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
26bc0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
26bd0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
26be0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
26bf0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
26c00 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26c10 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61  .      pTab->nTa
26c20 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  bRef = 1;.      
26c30 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
26c40 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
26c50 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c   "sqlite_sq_%p",
26c60 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
26c70 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
26c80 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
26c90 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
26ca0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
26cb0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
26cc0 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
26cd0 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e  ->pEList,&pTab->
26ce0 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c  nCol,&pTab->aCol
26cf0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  );.      pTab->i
26d00 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20  PKey = -1;.     
26d10 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
26d20 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
26d30 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
26d40 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
26d50 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
26d60 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
26d70 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  eral;.#endif.   
26d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
26d90 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
26da0 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
26db0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
26dc0 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
26dd0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
26de0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
26df0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
26e00 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
26e10 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
26e20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20  0, pFrom);.     
26e30 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
26e40 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26e50 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
26e60 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66  >nTabRef>=0xffff
26e70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26e80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26e90 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65  se, "too many re
26ea0 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73  ferences to \"%s
26eb0 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a  \": max 65535",.
26ec0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
26ed0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
26ee0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30   pFrom->pTab = 0
26ef0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26f00 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
26f10 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
26f20 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20  nTabRef++;.     
26f30 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
26f40 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42  pTab) && cannotB
26f50 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  eFunction(pParse
26f60 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
26f70 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
26f80 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69  bort;.      }.#i
26f90 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
26fa0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
26fb0 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
26fc0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
26fd0 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73  LE).      if( Is
26fe0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
26ff0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
27000 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43  {.        i16 nC
27010 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ol;.        if( 
27020 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
27030 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
27040 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
27050 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
27060 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
27070 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
27080 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
27090 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
270a0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
270b0 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
270c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
270d0 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
270e0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70  From->pSelect, p
270f0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
27100 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62       nCol = pTab
27110 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
27120 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  pTab->nCol = -1;
27130 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27140 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
27150 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  er, pFrom->pSele
27160 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  ct);.        pTa
27170 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  b->nCol = nCol;.
27180 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
27190 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63     }..    /* Loc
271a0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ate the index na
271b0 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58  med by the INDEX
271c0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66  ED BY clause, if
271d0 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
271e0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
271f0 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  yLookup(pParse, 
27200 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
27210 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
27220 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
27230 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
27240 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
27250 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
27260 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
27270 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
27280 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71  llocFailed || sq
27290 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
272a0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
272b0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
272c0 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  rt;.  }..  /* Fo
272d0 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
272e0 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
272f0 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
27300 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
27310 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
27320 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
27330 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
27340 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
27350 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
27360 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
27370 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
27380 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
27390 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
273a0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
273b0 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74  _ASTERISK operat
273c0 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
273d0 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
273e0 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a   the column.  **
273f0 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c   list.  The foll
27400 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
27410 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
27420 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20  e TK_ASTERISK.  
27430 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
27440 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f  nd expand each o
27450 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
27460 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
27470 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73  .  ** all tables
27480 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
27490 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
274a0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
274b0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
274c0 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
274d0 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
274e0 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
274f0 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
27500 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
27510 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61    pE = pEList->a
27520 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
27530 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  f( pE->op==TK_AS
27540 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a  TERISK ) break;.
27550 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
27560 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
27570 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
27580 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
27590 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45  p!=TK_DOT || (pE
275a0 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45  ->pLeft!=0 && pE
275b0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
275c0 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ID) );.    if( p
275d0 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
275e0 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
275f0 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62  =TK_ASTERISK ) b
27600 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
27610 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
27620 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
27630 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
27640 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
27650 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
27660 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
27670 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
27680 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
27690 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
276a0 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
276b0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
276c0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
276d0 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
276e0 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
276f0 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
27700 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
27710 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
27720 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
27730 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
27740 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
27750 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
27760 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
27770 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
27780 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
27790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277a0 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
277b0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
277c0 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
277d0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
277e0 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
277f0 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
27800 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69  pExpr;.      pRi
27810 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
27820 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27830 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
27840 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
27850 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
27860 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20  =TK_ASTERISK.   
27870 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d      && (pE->op!=
27880 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
27890 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53  ->op!=TK_ASTERIS
278a0 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  K).      ){.    
278b0 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
278c0 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
278d0 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
278e0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
278f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27900 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
27910 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
27920 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
27930 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
27940 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
27950 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
27960 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
27970 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
27980 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
27990 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
279a0 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
279b0 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
279c0 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
279d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
279e0 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
279f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
27a00 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
27a10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27a20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
27a30 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
27a40 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
27a50 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
27a60 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
27a70 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
27a80 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
27a90 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
27aa0 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
27ab0 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
27ac0 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
27ad0 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74  0;       /* text
27ae0 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
27af0 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
27b00 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
27b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
27b20 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
27b30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
27b40 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
27b50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
27b60 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
27b70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
27b80 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
27b90 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
27ba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
27bb0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
27bc0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
27bd0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
27be0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
27bf0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
27c00 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
27c10 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
27c20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSub = pFrom->p
27c30 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
27c40 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
27c50 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
27c60 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
27c70 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e  t char *zSchemaN
27c80 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
27c90 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
27ca0 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
27cb0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
27cc0 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
27cd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
27ce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27cf0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
27d00 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
27d10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
27d20 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d  Sub==0 || (pSub-
27d30 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
27d40 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b  estedFrom)==0 ){
27d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75  .            pSu
27d60 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  b = 0;.         
27d70 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
27d80 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
27d90 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
27da0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
27db0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27dd0 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
27de0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
27df0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
27e00 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
27e10 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
27e20 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
27e30 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
27e40 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
27e50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
27e60 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
27e70 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
27e80 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
27e90 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
27ea0 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
27eb0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
27ec0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
27ed0 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
27ee0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
27ef0 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
27f00 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
27f10 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
27f20 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
27f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
27f40 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
27f50 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
27f60 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
27f70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
27f80 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
27f90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27fa0 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
27fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
27fc0 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
27fd0 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
27fe0 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
27ff0 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
28000 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
28010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
28020 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
28030 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
28040 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
28050 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
28060 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74  hidden', omit it
28070 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64   from the expand
28080 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
28090 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
280a0 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c  t unless the SEL
280b0 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49  ECT has the SF_I
280c0 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20  ncludeHidden.   
280d0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20           ** bit 
280e0 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  set..           
280f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
28100 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
28110 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64   & SF_IncludeHid
28120 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  den)==0.        
28130 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e       && IsHidden
28140 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
28150 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20  ol[j]) .        
28160 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
28170 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28180 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28190 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
281a0 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  en = 1;..       
281b0 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
281c0 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  zTName==0 ){.   
281d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
281e0 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pFrom->fg.jointy
281f0 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
28200 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
28210 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43      && tableAndC
28220 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c  olumnIndex(pTabL
28230 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  ist, i, zName, 0
28240 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  , 0).           
28250 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
28260 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
28270 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
28280 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
28290 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
282a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
282b0 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68  able to the righ
282c0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
282d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
282e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
282f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28300 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
28310 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
28320 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pFrom->pUsing, z
28330 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
28340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28350 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
28360 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
28370 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
28380 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
28390 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
283a0 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
283b0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
283c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
283d0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
283e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
283f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28400 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
28410 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
28420 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  K_ID, zName);.  
28430 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
28440 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
28450 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
28460 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
28470 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c   if( longNames |
28480 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  | pTabList->nSrc
28490 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
284a0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
284b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
284c0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
284d0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54  pr(db, TK_ID, zT
284e0 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
284f0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
28500 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
28510 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
28520 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
28530 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
28540 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
28560 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
28570 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
28580 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
28590 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
285a0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
285b0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
285c0 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  Left, pExpr);.  
285d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
285e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
285f0 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
28610 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
28620 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
28630 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
28640 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
28650 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
28660 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
28670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28680 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28690 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
286a0 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
286b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
286c0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
286d0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
286e0 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
286f0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
28700 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
28710 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20  Init(&sColname, 
28720 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
28730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28740 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
28750 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
28760 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
28770 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
28780 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
28790 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
287a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
287b0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
287c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20  List_item *pX = 
287d0 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e  &pNew->a[pNew->n
287e0 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20  Expr-1];.       
287f0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20         if( pSub 
28800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28810 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
28820 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
28830 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  b, pSub->pEList-
28840 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[j].zSpan);.  
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
28860 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
28870 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
28880 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
288a0 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
288b0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
288c0 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20  %s.%s",.        
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288f0 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20     zSchemaName, 
28900 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  zTabName, zColna
28910 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
28920 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
28930 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
28960 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b  >bSpanIsTab = 1;
28970 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28980 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28990 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
289a0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
289b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
289c0 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
289d0 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
289e0 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
289f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28a00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
28a10 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
28a20 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
28a30 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
28a40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
28a50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28a60 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
28a70 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
28a80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28a90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28aa0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
28ab0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
28ac0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
28ad0 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
28ae0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
28af0 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
28b00 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
28b10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d  EList->nExpr>db-
28b20 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
28b30 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
28b40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
28b50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
28b60 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
28b70 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
28b80 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
28b90 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ort;.  }.#endif.
28ba0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28bb0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28bc0 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
28bd0 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
28be0 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
28bf0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
28c00 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
28c10 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
28c20 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
28c30 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
28c40 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
28c50 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
28c60 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
28c70 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
28c80 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
28c90 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
28ca0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
28cb0 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
28cc0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
28cd0 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
28ce0 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
28cf0 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
28d00 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
28d10 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e  rser tree..*/.in
28d20 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  t sqlite3ExprWal
28d30 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
28d40 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
28d50 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
28d60 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
28d70 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
28d80 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28d90 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28da0 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
28db0 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
28dc0 20 77 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45   walker for SELE
28dd0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
28de0 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
28df0 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
28e00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
28e10 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b  ectWalkNoop(Walk
28e20 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
28e30 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
28e40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28e50 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
28e60 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
28e70 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28e80 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
28e90 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20  UG./*.** Always 
28ea0 61 73 73 65 72 74 2e 20 20 54 68 69 73 20 78 53  assert.  This xS
28eb0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69  electCallback2 i
28ec0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72  mplementation pr
28ed0 6f 76 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  oves that the.**
28ee0 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
28ef0 32 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b  2 is never invok
28f00 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
28f10 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73  te3SelectWalkAss
28f20 65 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  ert2(Walker *Not
28f30 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  Used, Select *No
28f40 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
28f50 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
28f60 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
28f70 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
28f80 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54  }.#endif./*.** T
28f90 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
28fa0 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
28fb0 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
28fc0 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
28fd0 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
28fe0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
28ff0 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
29000 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
29010 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
29020 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
29030 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
29040 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
29050 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
29060 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
29070 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
29080 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
29090 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
290a0 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
290b0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
290c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
290d0 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
290e0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
290f0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
29100 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
29110 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
29120 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
29130 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
29140 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
29150 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
29160 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
29170 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
29180 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
29190 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
291a0 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
291b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
291c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
291d0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
291e0 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
291f0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
29200 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
29210 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
29220 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
29230 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
29240 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
29250 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f  f( pParse->hasCo
29260 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e  mpound ){.    w.
29270 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
29280 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  = convertCompoun
29290 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
292a0 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  y;.    w.xSelect
292b0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
292c0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
292d0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
292e0 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65  );.  }.  w.xSele
292f0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
29300 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77  ectExpander;.  w
29310 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
29320 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74  2 = selectPopWit
29330 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  h;.  sqlite3Walk
29340 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
29350 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
29360 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
29370 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
29380 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
29390 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
293a0 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
293b0 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
293c0 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
293d0 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
293e0 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
293f0 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
29400 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
29410 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
29420 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
29430 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
29440 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
29450 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
29460 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
29470 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
29480 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
29490 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
294a0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
294b0 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
294c0 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
294d0 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
294e0 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
294f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
29500 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
29510 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
29520 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
29530 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
29540 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
29550 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
29560 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
29570 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
29580 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
29590 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
295a0 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20  TypeInfo(Walker 
295b0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
295c0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
295d0 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Parse;.  int i;.
295e0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
295f0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
29600 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
29610 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  m;..  assert( p-
29620 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
29630 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73 73  esolved );.  ass
29640 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
29650 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
29660 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73  fo)==0 );.  p->s
29670 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
29680 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61  sTypeInfo;.  pPa
29690 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
296a0 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73  Parse;.  pTabLis
296b0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66  t = p->pSrc;.  f
296c0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
296d0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
296e0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
296f0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
29700 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
29710 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  rom->pTab;.    a
29720 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
29730 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
29740 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
29750 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a  phemeral)!=0 ){.
29760 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
29770 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
29780 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
29790 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  ECT */.      Sel
297a0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
297b0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
297c0 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
297d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
297e0 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
297f0 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
29800 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29810 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
29820 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
29830 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
29840 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
29850 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
29860 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
29870 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79  tine adds dataty
29880 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  pe and collating
29890 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d   sequence inform
298a0 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20  ation to.** the 
298b0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73  Table structures
298c0 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   of all FROM-cla
298d0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69  use subqueries i
298e0 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  n a.** SELECT st
298f0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55  atement..**.** U
29900 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
29910 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
29920 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
29930 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
29940 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50  ectAddTypeInfo(P
29950 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
29960 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
29970 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29980 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57  MIT_SUBQUERY.  W
29990 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65  alker w;.  w.xSe
299a0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
299b0 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
299c0 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Noop;.  w.xSelec
299d0 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
299e0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
299f0 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
29a00 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
29a10 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
29a20 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
29a30 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
29a40 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
29a50 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
29a60 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
29a70 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
29a80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29a90 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
29aa0 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
29ab0 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
29ac0 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
29ad0 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
29ae0 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
29af0 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
29b00 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
29b10 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
29b20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
29b30 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
29b40 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
29b50 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
29b60 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
29b70 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
29b80 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
29b90 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
29ba0 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
29bb0 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
29bc0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
29bd0 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
29be0 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
29bf0 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
29c00 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
29c10 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
29c20 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
29c30 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
29c40 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
29c50 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
29c60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
29c70 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
29c80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
29c90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
29ca0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
29cb0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
29cc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
29cd0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
29ce0 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
29cf0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
29d00 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
29d10 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
29d20 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73  tainer */.){.  s
29d30 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
29d40 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
29d50 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
29d60 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
29d70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
29d80 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
29d90 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
29da0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
29db0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
29dc0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
29dd0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
29de0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
29df0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
29e00 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
29e10 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
29e20 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
29e30 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
29e40 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
29e50 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
29e60 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
29e70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
29e80 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
29e90 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
29ea0 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
29eb0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
29ec0 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
29ed0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
29ee0 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
29ef0 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
29f00 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
29f10 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
29f20 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
29f30 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
29f40 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
29f50 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
29f60 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
29f70 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
29f80 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
29f90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
29fa0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
29fb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
29fc0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
29fd0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
29fe0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
29ff0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2a000 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
2a010 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
2a020 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
2a030 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
2a040 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
2a050 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
2a060 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2a070 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
2a080 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
2a090 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
2a0a0 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
2a0b0 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
2a0c0 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
2a0d0 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
2a0e0 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
2a0f0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
2a100 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
2a110 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2a120 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
2a130 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
2a140 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
2a150 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
2a160 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
2a170 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
2a180 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
2a190 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
2a1a0 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
2a1b0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2a1c0 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
2a1d0 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2a1e0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
2a1f0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
2a200 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
2a210 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2a220 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
2a230 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
2a240 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
2a250 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
2a260 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
2a270 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
2a280 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
2a290 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
2a2a0 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
2a2b0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2a2c0 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
2a2d0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
2a2e0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
2a2f0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
2a300 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
2a310 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2a320 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
2a330 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2a340 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
2a350 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
2a360 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
2a370 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
2a380 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2a390 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
2a3a0 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
2a3b0 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
2a3c0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
2a3d0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
2a3e0 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
2a3f0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
2a400 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
2a410 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2a420 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2a430 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2a440 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  E->x.pList, 0, 0
2a450 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2a460 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2a470 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2a480 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
2a490 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4b0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
2a4c0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2a4d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a4e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
2a4f0 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
2a500 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
2a510 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
2a520 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
2a530 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
2a540 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
2a550 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
2a560 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
2a570 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
2a580 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2a590 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2a5a0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2a5b0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
2a5c0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
2a5d0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
2a5e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
2a5f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2a600 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
2a610 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2a620 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
2a630 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
2a640 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2a650 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
2a660 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2a670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a680 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp2(v, OP_AggFi
2a690 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
2a6a0 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
2a6b0 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71  xpr : 0);.    sq
2a6c0 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
2a6d0 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20  4(v, pF->pFunc, 
2a6e0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P4_FUNCDEF);.  }
2a6f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
2a700 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2a710 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
2a720 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
2a730 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
2a740 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
2a750 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
2a760 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
2a770 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
2a780 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
2a790 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
2a7a0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2a7b0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2a7c0 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30    int regHit = 0
2a7d0 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54  ;.  int addrHitT
2a7e0 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  est = 0;.  struc
2a7f0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2a800 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
2a810 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
2a820 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
2a830 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72  tMode = 1;.  for
2a840 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
2a850 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
2a860 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2a870 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
2a880 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
2a890 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
2a8a0 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20   int regAgg;.   
2a8b0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2a8c0 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
2a8d0 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
2a8e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2a8f0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
2a900 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2a910 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
2a920 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
2a930 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
2a940 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74    regAgg = sqlit
2a950 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
2a960 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20  Parse, nArg);.  
2a970 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2a980 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
2a990 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67  se, pList, regAg
2a9a0 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45  g, 0, SQLITE_ECE
2a9b0 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73  L_DUP);.    }els
2a9c0 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
2a9d0 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
2a9e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
2a9f0 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
2aa00 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
2aa10 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
2aa20 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2aa30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2aa40 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20   nArg==0 );  /* 
2aa50 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  Error condition 
2aa60 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
2aa70 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f  e( nArg>1 );   /
2aa80 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20  * Also an error 
2aa90 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  */.      codeDis
2aaa0 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
2aab0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
2aac0 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
2aad0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2aae0 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
2aaf0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
2ab00 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
2ab10 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
2ab20 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
2ab30 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2ab40 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
2ab50 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2ab60 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
2ab70 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
2ab80 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
2ab90 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
2aba0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
2abb0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
2abc0 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
2abd0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2abe0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2abf0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2ac00 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
2ac10 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
2ac20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2ac30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
2ac40 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2ac50 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2ac60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
2ac70 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2ac80 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2ac90 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
2aca0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2acb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2acc0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
2acd0 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
2ace0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
2acf0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
2ad00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2ad10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
2ad20 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41  ggStep0, 0, regA
2ad30 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20  gg, pF->iMem);. 
2ad40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
2ad50 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46  pendP4(v, pF->pF
2ad60 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
2ad70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2ad80 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
2ad90 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
2ada0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
2adb0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
2adc0 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
2add0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
2ade0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
2adf0 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
2ae00 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
2ae10 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
2ae20 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2ae30 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
2ae40 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
2ae50 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2ae60 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
2ae70 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
2ae80 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20   populating the 
2ae90 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
2aea0 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65  sters, clear the
2aeb0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
2aec0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
2aed0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71  f any of the req
2aee0 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  uired column val
2aef0 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ues are already 
2af00 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e  present .  ** in
2af10 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69   registers, sqli
2af20 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61  te3ExprCode() ma
2af30 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74  y use OP_SCopy t
2af40 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65  o copy the value
2af50 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65  .  ** to pC->iMe
2af60 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69  m. But by the ti
2af70 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  me the value is 
2af80 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  used, the origin
2af90 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a  al register.  **
2afa0 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
2afb0 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e  sed, invalidatin
2afc0 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  g the underlying
2afd0 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20   buffer holding 
2afe0 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72  the.  ** text or
2aff0 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65   blob value. See
2b000 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64   ticket [883034d
2b010 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cb5]..  **.  ** 
2b020 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  Another solution
2b030 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61   would be to cha
2b040 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  nge the OP_SCopy
2b050 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61   used to copy ca
2b060 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ched.  ** values
2b070 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a   to an OP_Copy..
2b080 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69    */.  if( regHi
2b090 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
2b0a0 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
2b0b0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
2b0c0 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65  f, regHit); Vdbe
2b0d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
2b0e0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2b0f0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2b100 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  ;.  for(i=0, pC=
2b110 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
2b120 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
2b130 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
2b140 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
2b150 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2b160 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
2b170 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
2b180 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
2b190 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  de = 0;.  sqlite
2b1a0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2b1b0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61  pParse);.  if( a
2b1c0 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20  ddrHitTest ){.  
2b1d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2b1e0 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74  pHere(v, addrHit
2b1f0 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Test);.  }.}../*
2b200 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
2b210 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
2b220 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56  ruction to the V
2b230 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61  DBE to explain a
2b240 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74   simple.** count
2b250 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45  (*) query ("SELE
2b260 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2b270 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e   pTab")..*/.#ifn
2b280 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b290 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76  EXPLAIN.static v
2b2a0 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  oid explainSimpl
2b2b0 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20  eCount(.  Parse 
2b2c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2b2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2b2e0 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
2b2f0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b310 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2b320 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ueried */.  Inde
2b330 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2b340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b350 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74  ndex used to opt
2b360 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e  imize scan, or N
2b370 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
2b380 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
2b390 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  =2 ){.    int bC
2b3a0 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20  over = (pIdx!=0 
2b3b0 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
2b3c0 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79  b) || !IsPrimary
2b3d0 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29  KeyIndex(pIdx)))
2b3e0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70  ;.    char *zEqp
2b3f0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
2b400 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53  f(pParse->db, "S
2b410 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73  CAN TABLE %s%s%s
2b420 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
2b430 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
2b440 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47  bCover ? " USING
2b450 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
2b460 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20  " : "",.        
2b470 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a  bCover ? pIdx->z
2b480 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b  Name : "".    );
2b490 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b4a0 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
2b4b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
2b4c0 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
2b4d0 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
2b4e0 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e   0, zEqp, P4_DYN
2b4f0 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  AMIC.    );.  }.
2b500 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
2b510 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
2b520 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  unt(a,b,c).#endi
2b530 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74  f../*.** Context
2b540 20 6f 62 6a 65 63 74 20 66 6f 72 20 68 61 76 69   object for havi
2b550 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28  ngToWhereExprCb(
2b560 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 48 61 76  )..*/.struct Hav
2b570 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20 7b 0a  ingToWhereCtx {.
2b580 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2b590 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  ;.  ExprList *pG
2b5a0 72 6f 75 70 42 79 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  roupBy;.};../*.*
2b5b0 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  * sqlite3WalkExp
2b5c0 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  r() callback use
2b5d0 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57 68 65  d by havingToWhe
2b5e0 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re()..**.** If t
2b5f0 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64 20 74  he node passed t
2b600 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69  o the callback i
2b610 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c  s a TK_AND node,
2b620 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f   return .** WRC_
2b630 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c  Continue to tell
2b640 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2b650 28 29 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  () to iterate th
2b660 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f 64 65  rough child node
2b670 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
2b680 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43 5f 50  se, return WRC_P
2b690 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61  rune. In this ca
2b6a0 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20 69  se, also check i
2b6b0 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78  f the .** sub-ex
2b6c0 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73  pression matches
2b6d0 20 74 68 65 20 63 72 69 74 65 72 69 61 20 66 6f   the criteria fo
2b6e0 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f  r being moved to
2b6f0 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c   the WHERE.** cl
2b700 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61 64 64  ause. If so, add
2b710 20 69 74 20 74 6f 20 74 68 65 20 57 48 45 52 45   it to the WHERE
2b720 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65 70 6c   clause and repl
2b730 61 63 65 20 74 68 65 20 73 75 62 2d 65 78 70 72  ace the sub-expr
2b740 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e  ession.** within
2b750 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72   the HAVING expr
2b760 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20 63 6f  ession with a co
2b770 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73  nstant "1"..*/.s
2b780 74 61 74 69 63 20 69 6e 74 20 68 61 76 69 6e 67  tatic int having
2b790 54 6f 57 68 65 72 65 45 78 70 72 43 62 28 57 61  ToWhereExprCb(Wa
2b7a0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2b7b0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
2b7c0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
2b7d0 5f 41 4e 44 20 29 7b 0a 20 20 20 20 73 74 72 75  _AND ){.    stru
2b7e0 63 74 20 48 61 76 69 6e 67 54 6f 57 68 65 72 65  ct HavingToWhere
2b7f0 43 74 78 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  Ctx *p = pWalker
2b800 2d 3e 75 2e 70 48 61 76 69 6e 67 43 74 78 3b 0a  ->u.pHavingCtx;.
2b810 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2b820 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  xprIsConstantOrG
2b830 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e  roupBy(pWalker->
2b840 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
2b850 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20  ->pGroupBy) ){. 
2b860 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
2b870 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2b880 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78  se->db;.      Ex
2b890 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
2b8a0 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
2b8b0 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
2b8c0 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d  ite3IntTokens[1]
2b8d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2b8e0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
2b8f0 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 2a  Expr *pWhere = *
2b900 28 70 2d 3e 70 70 57 68 65 72 65 29 3b 0a 20 20  (p->ppWhere);.  
2b910 20 20 20 20 20 20 53 57 41 50 28 45 78 70 72 2c        SWAP(Expr,
2b920 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b   *pNew, *pExpr);
2b930 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
2b940 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
2b950 62 2c 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29  b, pWhere, pNew)
2b960 3b 0a 20 20 20 20 20 20 20 20 2a 28 70 2d 3e 70  ;.        *(p->p
2b970 70 57 68 65 72 65 29 20 3d 20 70 4e 65 77 3b 0a  pWhere) = pNew;.
2b980 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b990 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2b9a0 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ne;.  }.  return
2b9b0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2b9c0 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
2b9d0 20 65 6c 69 67 69 62 6c 65 20 74 65 72 6d 73 20   eligible terms 
2b9e0 66 72 6f 6d 20 74 68 65 20 48 41 56 49 4e 47 20  from the HAVING 
2b9f0 63 6c 61 75 73 65 20 6f 66 20 61 20 71 75 65 72  clause of a quer
2ba00 79 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 70  y, which is.** p
2ba10 72 6f 63 65 73 73 65 64 20 61 66 74 65 72 20 67  rocessed after g
2ba20 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68 65 20  rouping, to the 
2ba30 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 77 68  WHERE clause, wh
2ba40 69 63 68 20 69 73 20 70 72 6f 63 65 73 73 65 64  ich is processed
2ba50 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70   before.** group
2ba60 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ing. For example
2ba70 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  , the query:.**.
2ba80 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2ba90 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52  OM <tables> WHER
2baa0 45 20 61 3d 3f 20 47 52 4f 55 50 20 42 59 20 62  E a=? GROUP BY b
2bab0 20 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20   HAVING b=? AND 
2bac0 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65  c=?.**.** can be
2bad0 20 72 65 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a   rewritten as:.*
2bae0 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
2baf0 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48  FROM <tables> WH
2bb00 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20  ERE a=? AND b=? 
2bb10 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e  GROUP BY b HAVIN
2bb20 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65  G c=?.**.** A te
2bb30 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47  rm of the HAVING
2bb40 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
2bb50 6c 69 67 69 62 6c 65 20 66 6f 72 20 74 72 61 6e  ligible for tran
2bb60 73 66 65 72 20 69 66 20 69 74 20 63 6f 6e 73 69  sfer if it consi
2bb70 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20  sts.** entirely 
2bb80 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64  of constants and
2bb90 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
2bba0 74 20 61 72 65 20 61 6c 73 6f 20 47 52 4f 55 50  t are also GROUP
2bbb0 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 0a 2a   BY terms that.*
2bbc0 2a 20 75 73 65 20 74 68 65 20 22 42 49 4e 41 52  * use the "BINAR
2bbd0 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  Y" collation seq
2bbe0 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
2bbf0 20 76 6f 69 64 20 68 61 76 69 6e 67 54 6f 57 68   void havingToWh
2bc00 65 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ere(.  Parse *pP
2bc10 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74  arse,.  ExprList
2bc20 20 2a 70 47 72 6f 75 70 42 79 2c 0a 20 20 45 78   *pGroupBy,.  Ex
2bc30 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 0a 20 20  pr *pHaving, .  
2bc40 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 0a 29  Expr **ppWhere.)
2bc50 7b 0a 20 20 73 74 72 75 63 74 20 48 61 76 69 6e  {.  struct Havin
2bc60 67 54 6f 57 68 65 72 65 43 74 78 20 73 43 74 78  gToWhereCtx sCtx
2bc70 3b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b  ;.  Walker sWalk
2bc80 65 72 3b 0a 0a 20 20 73 43 74 78 2e 70 70 57 68  er;..  sCtx.ppWh
2bc90 65 72 65 20 3d 20 70 70 57 68 65 72 65 3b 0a 20  ere = ppWhere;. 
2bca0 20 73 43 74 78 2e 70 47 72 6f 75 70 42 79 20 3d   sCtx.pGroupBy =
2bcb0 20 70 47 72 6f 75 70 42 79 3b 0a 0a 20 20 6d 65   pGroupBy;..  me
2bcc0 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30  mset(&sWalker, 0
2bcd0 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72  , sizeof(sWalker
2bce0 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50  ));.  sWalker.pP
2bcf0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2bd00 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61   sWalker.xExprCa
2bd10 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e 67 54  llback = havingT
2bd20 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a 20 20  oWhereExprCb;.  
2bd30 73 57 61 6c 6b 65 72 2e 75 2e 70 48 61 76 69 6e  sWalker.u.pHavin
2bd40 67 43 74 78 20 3d 20 26 73 43 74 78 3b 0a 20 20  gCtx = &sCtx;.  
2bd50 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2bd60 26 73 57 61 6c 6b 65 72 2c 20 70 48 61 76 69 6e  &sWalker, pHavin
2bd70 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  g);.}../*.** Che
2bd80 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2bd90 20 70 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20   pThis entry of 
2bda0 70 54 61 62 4c 69 73 74 20 69 73 20 61 20 73 65  pTabList is a se
2bdb0 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69  lf-join of a pri
2bdc0 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69  or view..** If i
2bdd0 74 20 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72  t is, then retur
2bde0 6e 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74  n the SrcList_it
2bdf0 65 6d 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72  em for the prior
2be00 20 76 69 65 77 2e 20 20 49 66 20 69 74 20 69 73   view.  If it is
2be10 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65   not,.** then re
2be20 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
2be30 63 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  c struct SrcList
2be40 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69  _item *isSelfJoi
2be50 6e 56 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74  nView(.  SrcList
2be60 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
2be70 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
2be80 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69  for self-joins i
2be90 6e 20 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75  n this FROM clau
2bea0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
2beb0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68  rcList_item *pTh
2bec0 69 73 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  is   /* Search f
2bed0 6f 72 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e  or prior referen
2bee0 63 65 20 74 6f 20 74 68 69 73 20 73 75 62 71 75  ce to this subqu
2bef0 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ery */.){.  stru
2bf00 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2bf10 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49  *pItem;.  for(pI
2bf20 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  tem = pTabList->
2bf30 61 3b 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20  a; pItem<pThis; 
2bf40 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pItem++){.    if
2bf50 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
2bf60 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2bf70 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
2bf80 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
2bf90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2bfa0 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  f( pItem->zName=
2bfb0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2bfc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2bfd0 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44  tricmp(pItem->zD
2bfe0 61 74 61 62 61 73 65 2c 20 70 54 68 69 73 2d 3e  atabase, pThis->
2bff0 7a 44 61 74 61 62 61 73 65 29 21 3d 30 20 29 20  zDatabase)!=0 ) 
2c000 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2c010 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
2c020 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  p(pItem->zName, 
2c030 70 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30  pThis->zName)!=0
2c040 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c050 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2c060 43 6f 6d 70 61 72 65 28 30 2c 20 0a 20 20 20 20  Compare(0, .    
2c070 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 53 65        pThis->pSe
2c080 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 49  lect->pWhere, pI
2c090 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57  tem->pSelect->pW
2c0a0 68 65 72 65 2c 20 2d 31 29 20 0a 20 20 20 20 29  here, -1) .    )
2c0b0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  {.      /* The v
2c0c0 69 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64  iew was modified
2c0d0 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f   by some other o
2c0e0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68  ptimization such
2c0f0 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73   as.      ** pus
2c100 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
2c110 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  ) */.      conti
2c120 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  nue;.    }.    r
2c130 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d  eturn pItem;.  }
2c140 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2c150 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f  #ifdef SQLITE_CO
2c160 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49  UNTOFVIEW_OPTIMI
2c170 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74  ZATION./*.** Att
2c180 65 6d 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72  empt to transfor
2c190 6d 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  m a query of the
2c1a0 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53   form.**.**    S
2c1b0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2c1c0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52  ROM (SELECT x FR
2c1d0 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM t1 UNION ALL 
2c1e0 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32  SELECT y FROM t2
2c1f0 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69  ).**.** Into thi
2c200 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2c210 43 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74  CT (SELECT count
2c220 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45  (*) FROM t1)+(SE
2c230 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2c240 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65  OM t2).**.** The
2c250 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
2c260 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c  only works if al
2c270 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
2c280 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
2c290 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62 71  **   *  The subq
2c2a0 75 65 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20  uery is a UNION 
2c2b0 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  ALL of two or mo
2c2c0 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20  re terms.**   * 
2c2d0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45   There is no WHE
2c2e0 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  RE or GROUP BY o
2c2f0 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73  r HAVING clauses
2c300 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72 69   on the subqueri
2c310 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f  es.**   *  The o
2c320 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20  uter query is a 
2c330 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a  simple count(*).
2c340 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
2c350 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  E if the optimiz
2c360 61 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 74 61  ation is underta
2c370 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ken..*/.static i
2c380 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70  nt countOfViewOp
2c390 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73 65  timization(Parse
2c3a0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2c3b0 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a   *p){.  Select *
2c3c0 70 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20  pSub, *pPrior;. 
2c3d0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
2c3e0 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20  Expr *pCount;.  
2c3f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2c400 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2c410 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d  & SF_Aggregate)=
2c420 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
2c430 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 61   /* This is an a
2c440 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
2c450 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  /.  if( p->pELis
2c460 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
2c470 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
2c480 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
2c490 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
2c4a0 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
2c4b0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
2c4c0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
2c4d0 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
2c4e0 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ON ) return 0;  
2c4f0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
2c500 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
2c510 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2c520 5f 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e  _stricmp(pExpr->
2c530 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22  u.zToken,"count"
2c540 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  ) ) return 0;  /
2c550 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28  * Must be count(
2c560 29 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  ) */.  if( pExpr
2c570 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29 20 72  ->x.pList!=0 ) r
2c580 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2c590 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
2c5a0 20 62 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a   be count(*) */.
2c5b0 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e    if( p->pSrc->n
2c5c0 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
2c5d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c5e0 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65      /* One table
2c5f0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2c600 75 73 65 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  use */.  pSub = 
2c610 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2c620 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75  elect;.  if( pSu
2c630 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==0 ) return 0;
2c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2c660 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71  e FROM is a subq
2c670 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53  uery */.  if( pS
2c680 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20  ub->pPrior==0 ) 
2c690 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2c6b0 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  ust be a compoun
2c6c0 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  d subquery */.  
2c6d0 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62  do{.    if( pSub
2c6e0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20  ->op!=TK_ALL && 
2c6f0 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72  pSub->pPrior ) r
2c700 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73  eturn 0;  /* Mus
2c710 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a  t be UNION ALL *
2c720 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
2c730 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
2c740 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c750 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48          /* No WH
2c760 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2c770 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
2c780 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2c790 61 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ate ) return 0; 
2c7a0 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67      /* Not an ag
2c7b0 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70  gregate */.    p
2c7c0 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  Sub = pSub->pPri
2c7d0 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7f0 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20   /* Repeat over 
2c800 63 6f 6d 70 6f 75 6e 64 20 74 65 72 6d 73 20 2a  compound terms *
2c810 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53 75 62  /.  }while( pSub
2c820 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
2c830 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
2c840 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 69 74 20  , that means it 
2c850 69 73 20 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d  is OK to perform
2c860 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
2c870 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70  ion */..  db = p
2c880 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f  Parse->db;.  pCo
2c890 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 70  unt = pExpr;.  p
2c8a0 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 75 62  Expr = 0;.  pSub
2c8b0 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
2c8c0 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70  .pSelect;.  p->p
2c8d0 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
2c8e0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
2c8f0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
2c900 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d  , p->pSrc);.  p-
2c910 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44  >pSrc = sqlite3D
2c920 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
2c930 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
2c940 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20 77 68 69  p->pSrc));.  whi
2c950 6c 65 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20  le( pSub ){.    
2c960 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Expr *pTerm;.   
2c970 20 70 50 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e   pPrior = pSub->
2c980 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 53 75 62  pPrior;.    pSub
2c990 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
2c9a0 20 20 70 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20    pSub->pNext = 
2c9b0 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c  0;.    pSub->sel
2c9c0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72  Flags |= SF_Aggr
2c9d0 65 67 61 74 65 3b 0a 20 20 20 20 70 53 75 62 2d  egate;.    pSub-
2c9e0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
2c9f0 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70  _Compound;.    p
2ca00 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  Sub->nSelectRow 
2ca10 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2ca20 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
2ca30 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  b, pSub->pEList)
2ca40 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 50  ;.    pTerm = pP
2ca50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65 33 45 78  rior ? sqlite3Ex
2ca60 70 72 44 75 70 28 64 62 2c 20 70 43 6f 75 6e 74  prDup(db, pCount
2ca70 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20  , 0) : pCount;. 
2ca80 20 20 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 20     pSub->pEList 
2ca90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2caa0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
2cab0 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 70  0, pTerm);.    p
2cac0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 50 45  Term = sqlite3PE
2cad0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53  xpr(pParse, TK_S
2cae0 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20  ELECT, 0, 0);.  
2caf0 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64    sqlite3PExprAd
2cb00 64 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  dSelect(pParse, 
2cb10 70 54 65 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20  pTerm, pSub);.  
2cb20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
2cb30 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  {.      pExpr = 
2cb40 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65  pTerm;.    }else
2cb50 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  {.      pExpr = 
2cb60 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2cb70 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54  rse, TK_PLUS, pT
2cb80 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  erm, pExpr);.   
2cb90 20 7d 0a 20 20 20 20 70 53 75 62 20 3d 20 70 50   }.    pSub = pP
2cba0 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  rior;.  }.  p->p
2cbb0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
2cbc0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e  r = pExpr;.  p->
2cbd0 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
2cbe0 41 67 67 72 65 67 61 74 65 3b 0a 0a 23 69 66 20  Aggregate;..#if 
2cbf0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2cc00 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
2cc10 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2cc20 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x400 ){.    SELE
2cc30 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
2cc40 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63  arse,p,("After c
2cc50 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74  ount-of-view opt
2cc60 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b  imization:\n"));
2cc70 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2cc80 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2cc90 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2cca0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
2ccb0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43  ndif /* SQLITE_C
2ccc0 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d  OUNTOFVIEW_OPTIM
2ccd0 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  IZATION */../*.*
2cce0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2ccf0 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73  for the SELECT s
2cd00 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69  tatement given i
2cd10 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74  n the p argument
2cd20 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  .  .**.** The re
2cd30 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e  sults are return
2cd40 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
2cd50 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
2cd60 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65  tructure..** See
2cd70 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c   comments in sql
2cd80 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72  iteInt.h for fur
2cd90 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ther information
2cda0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2cdb0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
2cdc0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2cdd0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
2cde0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
2cdf0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
2ce00 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
2ce10 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
2ce20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
2ce30 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
2ce40 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
2ce50 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
2ce60 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
2ce70 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
2ce80 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2ce90 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
2cea0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2ceb0 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
2cec0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2ced0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2cee0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
2cef0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
2cf00 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
2cf10 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
2cf20 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
2cf30 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
2cf40 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
2cf50 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
2cf60 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
2cf70 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2cf80 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2cf90 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
2cfa0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2cfb0 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
2cfc0 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
2cfd0 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
2cfe0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
2cff0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
2d000 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
2d010 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
2d020 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
2d030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2d040 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
2d050 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
2d060 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
2d070 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20  t *pEList = 0;  
2d080 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
2d090 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
2d0a0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
2d0b0 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
2d0c0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
2d0d0 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
2d0e0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
2d0f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2d100 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
2d110 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
2d120 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
2d130 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
2d140 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
2d150 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
2d160 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
2d170 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
2d180 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
2d190 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
2d1a0 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
2d1b0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
2d1c0 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
2d1d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
2d1e0 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69   DistinctCtx sDi
2d1f0 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20  stinct; /* Info 
2d200 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
2d210 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
2d220 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ord */.  SortCtx
2d230 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20   sSort;         
2d240 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
2d250 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52  o code the ORDER
2d260 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2d270 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
2d280 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
2d290 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
2d2a0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
2d2b0 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2d2d0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
2d2e0 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
2d2f0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
2d300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2d310 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2d320 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ction */..#ifnde
2d330 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2d340 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73  PLAIN.  int iRes
2d350 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70  toreSelectId = p
2d360 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2d370 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  ;.  pParse->iSel
2d380 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
2d390 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b  iNextSelectId++;
2d3a0 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20  .#endif..  db = 
2d3b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
2d3c0 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
2d3d0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
2d3e0 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
2d3f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2d400 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
2d410 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
2d420 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
2d430 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
2d440 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
2d450 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
2d460 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66  (sAggInfo));.#if
2d470 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2d480 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e  BLED.  pParse->n
2d490 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a  SelectIndent++;.
2d4a0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2d4b0 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69  pParse,p, ("begi
2d4c0 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22  n processing:\n"
2d4d0 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ));.  if( sqlite
2d4e0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2d4f0 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x100 ){.    sqli
2d500 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2d510 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
2d520 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2d530 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2d540 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d550 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  !=SRT_DistFifo )
2d560 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2d570 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2d580 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2d590 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
2d5a0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2d5b0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d5c0 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  !=SRT_DistQueue 
2d5d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2d5e0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2d5f0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2d600 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20  _Queue );.  if( 
2d610 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
2d620 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61  (pDest) ){.    a
2d630 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
2d640 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
2d650 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2d660 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
2d670 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2d680 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
2d690 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
2d6a0 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c  t==SRT_Discard |
2d6b0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
2d6c0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51  st->eDest==SRT_Q
2d6d0 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e  ueue  || pDest->
2d6e0 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
2d6f0 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ifo ||.         
2d700 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2d710 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c  SRT_DistQueue ||
2d720 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2d730 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a  RT_Fifo);.    /*
2d740 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
2d750 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
2d760 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
2d770 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
2d780 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
2d790 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
2d7a0 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
2d7b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2d7c0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
2d7d0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
2d7e0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
2d7f0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2d800 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2d810 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
2d820 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
2d830 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  p, 0);.  memset(
2d840 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f  &sSort, 0, sizeo
2d850 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f  f(sSort));.  sSo
2d860 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
2d870 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
2d880 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
2d890 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2d8a0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
2d8b0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
2d8c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2d8d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
2d8e0 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  >pEList!=0 );.  
2d8f0 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
2d900 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2d910 61 74 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c  ate)!=0;.#if SEL
2d920 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2d930 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2d940 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2d950 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2d960 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2d970 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d  e,p, ("after nam
2d980 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22  e resolution:\n"
2d990 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2d9a0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2d9b0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2d9c0 69 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70  if..  /* Get a p
2d9d0 6f 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20  ointer the VDBE 
2d9e0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
2d9f0 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  on, allocating a
2da00 20 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65   new VDBE if one
2da10 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61  .  ** does not a
2da20 6c 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a  lready exist */.
2da30 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
2da40 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
2da50 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
2da60 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 69 66  select_end;.  if
2da70 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
2da80 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
2da90 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
2daa0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
2dab0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20  ;.  }..  /* Try 
2dac0 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
2dad0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
2dae0 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f  M clause up into
2daf0 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a   the main query.
2db00 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
2db10 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
2db20 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
2db30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2db40 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
2db50 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69   !p->pPrior && i
2db60 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2db70 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2db80 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2db90 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
2dba0 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
2dbb0 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
2dbc0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
2dbd0 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 20 20  int isAggSub;.  
2dbe0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2dbf0 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pItem->pTab;.   
2dc00 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
2dc10 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
2dc20 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20   Catch mismatch 
2dc30 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65 64 20  in the declared 
2dc40 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65  columns of a vie
2dc50 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  w and the number
2dc60 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d   of.    ** colum
2dc70 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
2dc80 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   on the RHS */. 
2dc90 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f     if( pTab->nCo
2dca0 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  l!=pSub->pEList-
2dcb0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
2dcc0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2dcd0 70 50 61 72 73 65 2c 20 22 65 78 70 65 63 74 65  pParse, "expecte
2dce0 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  d %d columns for
2dcf0 20 27 25 73 27 20 62 75 74 20 67 6f 74 20 25 64   '%s' but got %d
2dd00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2dd10 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
2dd20 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Col, pTab->zName
2dd30 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
2dd40 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f  nExpr);.      go
2dd50 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2dd60 20 20 20 7d 0a 0a 20 20 20 20 69 73 41 67 67 53     }..    isAggS
2dd70 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46  ub = (pSub->selF
2dd80 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2dd90 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28  ate)!=0;.    if(
2dda0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
2ddb0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
2ddc0 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20  sAgg, isAggSub) 
2ddd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2dde0 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
2ddf0 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
2de00 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
2de10 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62      if( isAggSub
2de20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67   ){.        isAg
2de30 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  g = 1;.        p
2de40 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2de50 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
2de60 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31    }.      i = -1
2de70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
2de80 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2de90 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2dea0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2deb0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2dec0 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
2ded0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2dee0 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2def0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
2df00 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  By;.    }.  }.#e
2df10 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
2df20 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
2df30 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48  ND_SELECT.  /* H
2df40 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53  andle compound S
2df50 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
2df60 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61 72   using the separ
2df70 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  ate multiSelect(
2df80 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65  ).  ** procedure
2df90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
2dfa0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63  pPrior ){.    rc
2dfb0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70   = multiSelect(p
2dfc0 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
2dfd0 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74  ;.    explainSet
2dfe0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
2dff0 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
2e000 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 23 69  oreSelectId);.#i
2e010 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2e020 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54  ABLED.    SELECT
2e030 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
2e040 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d  ,("end compound-
2e050 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
2e060 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50 61 72  g\n"));.    pPar
2e070 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
2e080 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t--;.#endif.    
2e090 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
2e0a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20  endif..  /* For 
2e0b0 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  each term in the
2e0c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f   FROM clause, do
2e0d0 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a   two things:.  *
2e0e0 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65 64  * (1) Authorized
2e0f0 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61   unreferenced ta
2e100 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47 65  bles.  ** (2) Ge
2e110 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2e120 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 0a  all sub-queries.
2e130 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2e140 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2e150 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
2e160 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2e170 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
2e180 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
2e190 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
2e1a0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b     Select *pSub;
2e1b0 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 20 53  ..    /* Issue S
2e1c0 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f  QLITE_READ autho
2e1d0 72 69 7a 61 74 69 6f 6e 73 20 77 69 74 68 20 61  rizations with a
2e1e0 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
2e1f0 65 20 66 6f 72 20 61 6e 79 20 74 61 62 6c 65 73  e for any tables
2e200 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65   that.    ** are
2e210 20 72 65 66 65 72 65 6e 63 65 64 20 62 75 74 20   referenced but 
2e220 66 72 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76 61  from which no va
2e230 6c 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74  lues are extract
2e240 65 64 2e 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  ed. Examples of 
2e250 77 68 65 72 65 20 74 68 65 73 65 0a 20 20 20 20  where these.    
2e260 2a 2a 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c  ** kinds of null
2e270 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74   SQLITE_READ aut
2e280 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 6f 75 6c  horizations woul
2e290 64 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a  d occur:.    **.
2e2a0 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43      **     SELEC
2e2b0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2e2c0 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f  t1;   -- SQLITE_
2e2d0 52 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a  READ t1."".    *
2e2e0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e  *     SELECT t1.
2e2f0 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20  * FROM t1, t2;  
2e300 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   -- SQLITE_READ 
2e310 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20  t2."".    **.   
2e320 20 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c   ** The fake col
2e330 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65  umn name is an e
2e340 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74  mpty string.  It
2e350 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
2e360 20 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20   a table to.    
2e370 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e  ** have a column
2e380 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d   named by the em
2e390 70 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77  pty string, in w
2e3a0 68 69 63 68 20 63 61 73 65 20 74 68 65 72 65 20  hich case there 
2e3b0 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20  is no way to.   
2e3c0 20 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20   ** distinguish 
2e3d0 62 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66  between an unref
2e3e0 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e  erenced table an
2e3f0 64 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65  d an actual refe
2e400 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20  rence to the.   
2e410 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 20   ** "" column.  
2e420 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
2e430 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20  ign was for the 
2e440 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
2e450 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20   to be a NULL,. 
2e460 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c     ** which woul
2e470 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73  d be unambiguous
2e480 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20 61 75  .  But legacy au
2e490 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c  thorization call
2e4a0 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20  backs might.    
2e4b0 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f  ** assume the co
2e4c0 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e  lumn name is non
2e4d0 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75  -NULL and segfau
2e4e0 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  lt.  The use of 
2e4f0 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a  an empty string.
2e500 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 66      ** for the f
2e510 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
2e520 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20  seems safer..   
2e530 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
2e540 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b  m->colUsed==0 ){
2e550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
2e560 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
2e570 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74  SQLITE_READ, pIt
2e580 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70  em->zName, "", p
2e590 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
2e5a0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65  ;.    }..#if !de
2e5b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2e5c0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
2e5d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2e5e0 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a  MIT_VIEW).    /*
2e5f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
2e600 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
2e610 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2e620 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20  lause.    */.   
2e630 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pSub = pItem->p
2e640 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20  Select;.    if( 
2e650 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pSub==0 ) contin
2e660 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65  ue;..    /* Some
2e670 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66  times the code f
2e680 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77 69  or a subquery wi
2e690 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  ll be generated 
2e6a0 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a  more than.    **
2e6b0 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75   once, if the su
2e6c0 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f  bquery is part o
2e6d0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2e6e0 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49  se in a LEFT JOI
2e6f0 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78  N,.    ** for ex
2e700 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  ample.  In that 
2e710 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67  case, do not reg
2e720 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
2e730 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20   to manifest.   
2e740 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68   ** a view or th
2e750 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20  e co-routine to 
2e760 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77  implement a view
2e770 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 73  .  The first ins
2e780 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20  tance.    ** is 
2e790 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75  sufficient, thou
2e7a0 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  gh the subroutin
2e7b0 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68  e to manifest th
2e7c0 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64  e view does need
2e7d0 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  .    ** to be in
2e7e0 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a  voked again. */.
2e7f0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61      if( pItem->a
2e800 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20  ddrFillSub ){.  
2e810 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
2e820 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d  g.viaCoroutine==
2e830 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2e840 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  The subroutine t
2e850 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20 74 68  hat manifests th
2e860 65 20 76 69 65 77 20 6d 69 67 68 74 20 62 65 20  e view might be 
2e870 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69  a one-time routi
2e880 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ne,.        ** o
2e890 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65 64 20  r it might need 
2e8a0 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e 20 65  to be rerun on e
2e8b0 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 62 65  ach iteration be
2e8c0 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 20  cause it.       
2e8d0 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20 63 6f   ** encodes a co
2e8e0 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
2e8f0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65  y. */.        te
2e900 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 56  stcase( sqlite3V
2e910 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49 74 65  dbeGetOp(v, pIte
2e920 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 2d  m->addrFillSub)-
2e930 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65  >opcode==OP_Once
2e940 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
2e950 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e960 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
2e970 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
2e980 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
2e990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e9a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2e9b0 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
2e9c0 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
2e9d0 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
2e9e0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
2e9f0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
2ea00 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
2ea10 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
2ea20 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
2ea30 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
2ea40 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
2ea50 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
2ea60 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
2ea70 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
2ea80 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
2ea90 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
2eaa0 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
2eab0 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
2eac0 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
2ead0 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
2eae0 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
2eaf0 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
2eb00 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
2eb10 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
2eb20 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
2eb30 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2eb40 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
2eb50 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63  Make copies of c
2eb60 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c  onstant WHERE-cl
2eb70 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68  ause terms in th
2eb80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
2eb90 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65  wn.    ** inside
2eba0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
2ebb0 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68  This can help th
2ebc0 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75  e subquery to ru
2ebd0 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  n more efficient
2ebe0 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2ebf0 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  f( (pItem->fg.jo
2ec00 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
2ec10 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 75  R)==0.     && pu
2ec20 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
2ec30 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70  (pParse, pSub, p
2ec40 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
2ec50 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b  >iCursor).    ){
2ec60 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2ec70 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69  _ENABLED.      i
2ec80 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2ec90 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2eca0 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54  .        SELECTT
2ecb0 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2ecc0 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45 52  e,p,("After WHER
2ecd0 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f  E-clause push-do
2ece0 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  wn:\n"));.      
2ecf0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2ed00 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2ed10 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2ed20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
2ed30 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
2ed40 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75  implement the su
2ed50 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20  bquery.    **.  
2ed60 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72    ** The subquer
2ed70 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  y is implemented
2ed80 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
2ed90 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
2eda0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a   are true:.    *
2edb0 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
2edc0 71 75 65 72 79 20 69 73 20 67 75 61 72 61 6e 74  query is guarant
2edd0 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75  eed to be the ou
2ede0 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61  ter loop (so tha
2edf0 74 20 69 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  t it.    **     
2ee00 20 20 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64     does not need
2ee10 20 74 6f 20 62 65 20 63 6f 6d 70 75 74 65 64 20   to be computed 
2ee20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a  more than once).
2ee30 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 54 68      **   (2)  Th
2ee40 65 20 41 4c 4c 20 6b 65 79 77 6f 72 64 20 61 66  e ALL keyword af
2ee50 74 65 72 20 53 45 4c 45 43 54 20 69 73 20 6f 6d  ter SELECT is om
2ee60 69 74 74 65 64 2e 20 20 28 41 70 70 6c 69 63 61  itted.  (Applica
2ee70 74 69 6f 6e 73 20 61 72 65 0a 20 20 20 20 2a 2a  tions are.    **
2ee80 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20          allowed 
2ee90 74 6f 20 73 61 79 20 22 53 45 4c 45 43 54 20 41  to say "SELECT A
2eea0 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 6a  LL" instead of j
2eeb0 75 73 74 20 22 53 45 4c 45 43 54 22 20 74 6f 20  ust "SELECT" to 
2eec0 64 69 73 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20  disable.    **  
2eed0 20 20 20 20 20 20 74 68 65 20 75 73 65 20 6f 66        the use of
2eee0 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 29 0a 20   co-routines.). 
2eef0 20 20 20 2a 2a 20 20 20 28 33 29 20 20 43 6f 2d     **   (3)  Co-
2ef00 72 6f 75 74 69 6e 65 73 20 61 72 65 20 6e 6f 74  routines are not
2ef10 20 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20   disabled using 
2ef20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2ef30 74 72 6f 6c 28 29 0a 20 20 20 20 2a 2a 20 20 20  trol().    **   
2ef40 20 20 20 20 20 77 69 74 68 20 53 51 4c 49 54 45       with SQLITE
2ef50 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
2ef60 5a 41 54 49 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a  ZATIONS..    **.
2ef70 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65      ** TODO: Are
2ef80 20 74 68 65 72 65 20 6f 74 68 65 72 20 72 65 61   there other rea
2ef90 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29 20  sons beside (1) 
2efa0 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74  to use a co-rout
2efb0 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65  ine.    ** imple
2efc0 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a  mentation?.    *
2efd0 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20  /.    if( i==0. 
2efe0 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74      && (pTabList
2eff0 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20  ->nSrc==1.      
2f000 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69        || (pTabLi
2f010 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e  st->a[1].fg.join
2f020 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54  type&(JT_LEFT|JT
2f030 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a  _CROSS))!=0)  /*
2f040 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 26 26 20   (1) */.     && 
2f050 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2f060 46 5f 41 6c 6c 29 3d 3d 30 20 20 20 20 20 20 20  F_All)==0       
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2f090 32 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 4f 70  2) */.     && Op
2f0a0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2f0b0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62  d(db, SQLITE_Sub
2f0c0 71 43 6f 72 6f 75 74 69 6e 65 29 20 20 20 20 20  qCoroutine)     
2f0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29            /* (3)
2f0e0 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
2f0f0 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
2f100 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
2f110 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
2f120 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2f130 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
2f140 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
2f150 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
2f160 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2f170 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2f180 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
2f190 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2f1a0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2f1b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2f1c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f1d0 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
2f1e0 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2f1f0 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
2f200 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
2f210 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2f220 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2f230 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
2f240 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2f250 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
2f260 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2f270 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2f280 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
2f290 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2f2a0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2f2b0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2f2c0 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2f2d0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2f2e0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
2f2f0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2f300 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2f310 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
2f320 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2f330 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
2f340 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ow;.      pItem-
2f350 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2f360 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
2f370 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
2f380 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
2f390 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
2f3a0 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65  oroutine(v, pIte
2f3b0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2f3c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f3d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2f3e0 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  Top-1);.      sq
2f3f0 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
2f400 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
2f410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f420 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
2f430 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
2f440 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65  ill fill an ephe
2f450 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68  meral table with
2f460 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
2f470 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
2f480 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
2f490 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
2f4a0 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
2f4b0 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  to the address o
2f4c0 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
2f4d0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74  subroutine.  pIt
2f4e0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20  em->regReturn.  
2f4f0 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69      ** is a regi
2f500 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
2f510 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f  o hold the subro
2f520 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64  utine return add
2f530 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ress.      */.  
2f540 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b      int topAddr;
2f550 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41  .      int onceA
2f560 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
2f570 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20  nt retAddr;.    
2f580 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2f590 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a  _item *pPrior;..
2f5a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2f5b0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2f5c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
2f5d0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2f5e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2f5f0 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
2f600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f610 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2f620 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
2f630 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
2f640 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2f650 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
2f660 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2f670 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
2f680 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2f690 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2f6a0 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
2f6b0 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
2f6c0 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
2f6d0 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
2f6e0 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
2f6f0 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
2f700 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2f710 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
2f720 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
2f730 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
2f740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f750 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
2f760 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2f770 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2f780 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
2f790 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
2f7a0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2f7b0 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
2f7c0 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
2f7d0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
2f7e0 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
2f7f0 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
2f800 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2f810 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  }.      pPrior =
2f820 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28   isSelfJoinView(
2f830 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29  pTabList, pItem)
2f840 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
2f850 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  or ){.        sq
2f860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f870 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
2f880 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
2f890 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b  Prior->iCursor);
2f8a0 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
2f8b0 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2f8c0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 70 50 72  ->iSelectId, pPr
2f8d0 69 6f 72 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b  ior->iSelectId);
2f8e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f8f0 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
2f900 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
2f910 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  Sub->nSelectRow 
2f920 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  = pPrior->pSelec
2f930 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  t->nSelectRow;. 
2f940 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f950 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2f960 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
2f970 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
2f980 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2f990 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
2f9a0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2f9b0 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2f9c0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2f9d0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20  ectId);.        
2f9e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
2f9f0 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
2fa00 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2fa10 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
2fa20 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62  RowLogEst = pSub
2fa30 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
2fa40 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72      if( onceAddr
2fa50 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
2fa60 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64  mpHere(v, onceAd
2fa70 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64  dr);.      retAd
2fa80 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2fa90 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2faa0 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  urn, pItem->regR
2fab0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
2fac0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
2fad0 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
2fae0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2faf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2fb00 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64  hangeP1(v, topAd
2fb10 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20  dr, retAddr);.  
2fb20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
2fb30 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
2fb40 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rse);.    }.    
2fb50 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2fb60 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2fb70 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72  ct_end;.    pPar
2fb80 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73  se->nHeight -= s
2fb90 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2fba0 48 65 69 67 68 74 28 70 29 3b 0a 23 65 6e 64 69  Height(p);.#endi
2fbb0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69  f.  }..  /* Vari
2fbc0 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ous elements of 
2fbd0 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65  the SELECT copie
2fbe0 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72  d into local var
2fbf0 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20  iables for.  ** 
2fc00 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20  convenience */. 
2fc10 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
2fc20 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  ist;.  pWhere = 
2fc30 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
2fc40 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
2fc50 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
2fc60 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
2fc70 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2fc80 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
2fc90 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
2fca0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
2fcb0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
2fcc0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2fcd0 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
2fce0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2fcf0 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
2fd00 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  After all FROM-c
2fd10 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c  lause analysis:\
2fd20 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
2fd30 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2fd40 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2fd50 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
2fd60 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f  ITE_COUNTOFVIEW_
2fd70 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
2fd80 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  f( OptimizationE
2fd90 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2fda0 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
2fdb0 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56  |SQLITE_CountOfV
2fdc0 69 65 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74  iew).   && count
2fdd0 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69  OfViewOptimizati
2fde0 6f 6e 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20  on(pParse, p).  
2fdf0 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  ){.    if( db->m
2fe00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2fe10 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2fe20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70     pEList = p->p
2fe30 45 4c 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c  EList;.    pTabL
2fe40 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2fe50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2fe60 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
2fe70 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e  DISTINCT with an
2fe80 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73   ORDER BY but is
2fe90 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
2fea0 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20  e, and .  ** if 
2feb0 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  the select-list 
2fec0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
2fed0 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74  he ORDER BY list
2fee0 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72  , then this quer
2fef0 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65  y.  ** can be re
2ff00 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f  written as a GRO
2ff10 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20  UP BY. In other 
2ff20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a  words, this:.  *
2ff30 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
2ff40 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46  T DISTINCT xyz F
2ff50 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
2ff60 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69   xyz.  **.  ** i
2ff70 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  s transformed to
2ff80 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2ff90 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20  SELECT xyz FROM 
2ffa0 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a  ... GROUP BY xyz
2ffb0 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
2ffc0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
2ffd0 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
2ffe0 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
2fff0 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
30000 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
30010 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
30020 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
30030 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
30040 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
30050 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
30060 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
30070 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
30080 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
30090 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
300a0 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
300b0 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
300c0 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
300d0 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
300e0 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
300f0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
30100 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
30110 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
30120 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
30130 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
30140 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f  rListCompare(sSo
30150 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c  rt.pOrderBy, pEL
30160 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b  ist, -1)==0.  ){
30170 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
30180 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
30190 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
301a0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
301b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
301c0 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29  p(db, pEList, 0)
301d0 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20  ;.    /* Notice 
301e0 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
301f0 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61  t SF_Distinct ha
30200 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66  s been cleared f
30210 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c  rom p->selFlags,
30220 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73  .    ** the sDis
30230 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20  tinct.isTnct is 
30240 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63  still set.  Henc
30250 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73  e, isTnct repres
30260 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ents the.    ** 
30270 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67  original setting
30280 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69   of the SF_Disti
30290 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68  nct flag, not th
302a0 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
302b0 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  g */.    assert(
302c0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
302d0 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  t );..#if SELECT
302e0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
302f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
30300 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
30310 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   ){.      SELECT
30320 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
30330 73 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d  se,p,("Transform
30340 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47   DISTINCT into G
30350 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20  ROUP BY:\n"));. 
30360 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
30370 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
30380 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
30390 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  f.  }..  /* If t
303a0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
303b0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
303c0 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d   create an ephem
303d0 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20  eral index to.  
303e0 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e  ** do the sortin
303f0 67 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72  g.  But this sor
30400 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69  ting ephemeral i
30410 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
30420 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75  p.  ** being unu
30430 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
30440 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
30450 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
30460 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rder..  ** If th
30470 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
30480 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e  then the OP_Open
30490 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
304a0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20  ction will be.  
304b0 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  ** changed to an
304c0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65   OP_Noop once we
304d0 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
304e0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
304f0 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e  ex is.  ** not n
30500 65 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72  eeded.  The sSor
30510 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
30520 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
30530 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20   to facilitate. 
30540 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e   ** that change.
30550 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
30560 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
30570 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
30580 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
30590 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
305a0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
305b0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
305c0 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  0, pEList->nExpr
305d0 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43  );.    sSort.iEC
305e0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
305f0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72  nTab++;.    sSor
30600 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
30610 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
30620 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
30630 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
30640 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69           sSort.i
30650 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70  ECursor, sSort.p
30660 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
30670 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  +pEList->nExpr, 
30680 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68  0,.          (ch
30690 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
306a0 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29  _KEYINFO.      )
306b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
306c0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
306d0 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
306e0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
306f0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
30700 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
30710 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
30720 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
30730 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
30740 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
30750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30760 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
30770 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
30780 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  iSDParm, pEList-
30790 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
307a0 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
307b0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
307c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
307d0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28  eLabel(v);.  if(
307e0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
307f0 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d  SF_FixedLimit)==
30800 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  0 ){.    p->nSel
30810 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
30820 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
30830 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74   */.  }.  comput
30840 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
30850 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
30860 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
30870 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
30880 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
30890 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
308a0 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c  eChangeOpcode(v,
308b0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
308c0 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  ndex, OP_SorterO
308d0 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  pen);.    sSort.
308e0 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52  sortFlags |= SOR
308f0 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b  TFLAG_UseSorter;
30900 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
30910 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
30920 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
30930 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
30940 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
30950 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
30960 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73  inct ){.    sDis
30970 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20  tinct.tabTnct = 
30980 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
30990 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64      sDistinct.ad
309a0 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33  drTnct = sqlite3
309b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
309c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
309d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69               sDi
309f0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20  stinct.tabTnct, 
30a00 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
30a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66     (char*)keyInf
30a30 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
30a40 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  arse, p->pEList,
30a50 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  0,0),.          
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a70 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
30a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
30a90 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
30aa0 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
30ab0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
30ac0 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
30ad0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b  TINCT_UNORDERED;
30ae0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44  .  }else{.    sD
30af0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
30b00 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
30b10 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  CT_NOOP;.  }..  
30b20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
30b30 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
30b40 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65   /* No aggregate
30b50 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
30b60 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
30b70 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74  e */.    u16 wct
30b80 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74  rlFlags = (sDist
30b90 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48  inct.isTnct ? WH
30ba0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
30bb0 54 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65  T : 0);.    asse
30bc0 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  rt( WHERE_USE_LI
30bd0 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d  MIT==SF_FixedLim
30be0 69 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46  it );.    wctrlF
30bf0 6c 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c  lags |= p->selFl
30c00 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69  ags & SF_FixedLi
30c10 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67  mit;..    /* Beg
30c20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
30c30 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49  scan. */.    pWI
30c40 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
30c50 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
30c60 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
30c70 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
30c80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ca0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72   p->pEList, wctr
30cb0 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65  lFlags, p->nSele
30cc0 63 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20  ctRow);.    if( 
30cd0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
30ce0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
30cf0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
30d00 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
30d10 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65  pWInfo) < p->nSe
30d20 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
30d30 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
30d40 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
30d50 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
30d60 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
30d70 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  f( sDistinct.isT
30d80 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68  nct && sqlite3Wh
30d90 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
30da0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73  Info) ){.      s
30db0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
30dc0 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  pe = sqlite3Wher
30dd0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
30de0 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
30df0 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
30e00 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  y ){.      sSort
30e10 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65  .nOBSat = sqlite
30e20 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
30e30 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  pWInfo);.      s
30e40 53 6f 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e  Sort.bOrderedInn
30e50 65 72 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  erLoop = sqlite3
30e60 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65  WhereOrderedInne
30e70 72 4c 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20  rLoop(pWInfo);. 
30e80 20 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e       if( sSort.n
30e90 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72  OBSat==sSort.pOr
30ea0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
30eb0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f          sSort.pO
30ec0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
30ed0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
30ee0 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64  * If sorting ind
30ef0 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61  ex that was crea
30f00 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f  ted by a prior O
30f10 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
30f20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
30f30 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74  ion ended up not
30f40 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74   being needed, t
30f50 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f  hen change the O
30f60 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a  P_OpenEphemeral.
30f70 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f      ** into an O
30f80 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  P_Noop..    */. 
30f90 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64     if( sSort.add
30fa0 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
30fb0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d   sSort.pOrderBy=
30fc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
30fd0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
30fe0 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
30ff0 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
31000 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74   }..    /* Use t
31010 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
31020 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73  r loop. */.    s
31030 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
31040 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
31050 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73  , -1, &sSort, &s
31060 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
31070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31080 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
31090 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70  eContinueLabel(p
310a0 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  WInfo),.        
310b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
310c0 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62  te3WhereBreakLab
310d0 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20  el(pWInfo));..  
310e0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
310f0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
31100 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
31110 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
31120 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
31130 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77    /* This case w
31140 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20  hen there exist 
31150 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
31160 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42  ons or a GROUP B
31170 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
31180 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e  or both */.    N
31190 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
311a0 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
311b0 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
311c0 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
311d0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
311e0 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
311f0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
31200 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
31210 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
31220 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
31230 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
31240 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
31250 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
31260 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
31270 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
31280 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
31290 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
312a0 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
312b0 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
312c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312d0 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
312e0 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
312f0 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
31300 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
31310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
31320 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
31330 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
31340 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
31350 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
31360 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
31370 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
31380 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
31390 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
313a0 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
313b0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
313c0 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
313d0 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  nd;        /* En
313e0 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
313f0 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
31400 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50  */.    int sortP
31410 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73  Tab = 0;   /* Ps
31420 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74  eudotable used t
31430 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67  o decode sorting
31440 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
31450 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b  int sortOut = 0;
31460 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65      /* Output re
31470 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20  gister from the 
31480 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
31490 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30  t orderByGrp = 0
314a0 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ; /* True if the
314b0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52   GROUP BY and OR
314c0 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73  DER BY are the s
314d0 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ame */..    /* R
314e0 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
314f0 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
31500 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
31510 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
31520 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
31530 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
31540 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
31550 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
31560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31570 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
31580 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
31590 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
315a0 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
315b0 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
315c0 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
315d0 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
315e0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
315f0 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
31600 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
31610 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
31620 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
31630 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
31640 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
31650 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
31660 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
31670 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
31680 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
31690 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
316a0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
316b0 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71    assert( 66==sq
316c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
316d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
316e0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29  >nSelectRow>66 )
316f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
31700 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   66;.    }else{.
31710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
31720 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
31730 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ) );.      p->nS
31740 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
31750 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
31760 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
31770 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
31780 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
31790 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20  nd they are.    
317a0 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
317b0 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73  en it may be pos
317c0 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65  sible to disable
317d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
317e0 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  ause .    ** on 
317f0 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74  the grounds that
31800 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69   the GROUP BY wi
31810 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
31820 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20  s to come out . 
31830 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72     ** in the cor
31840 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61  rect order. It a
31850 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68  lso may not - th
31860 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74  e GROUP BY might
31870 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
31880 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
31890 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
318a0 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
318b0 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
318c0 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
318d0 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
318e0 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
318f0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
31900 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
31910 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
31920 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
31930 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
31940 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
31950 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
31960 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
31970 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
31980 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
31990 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
319a0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
319b0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
319c0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
319d0 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
319e0 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
319f0 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
31a00 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
31a10 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
31a20 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
31a30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
31a40 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
31a50 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
31a60 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
31a70 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
31a80 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
31a90 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
31aa0 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
31ab0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
31ac0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
31ad0 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
31ae0 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
31af0 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
31b00 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
31b10 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
31b20 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
31b30 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41  List;.    sNC.pA
31b40 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e  ggInfo = &sAggIn
31b50 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  fo;.    sAggInfo
31b60 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mnReg = pParse-
31b70 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67  >nMem+1;.    sAg
31b80 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
31b90 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
31ba0 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
31bb0 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  r : 0;.    sAggI
31bc0 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
31bd0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
31be0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
31bf0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
31c00 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
31c10 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
31c20 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e  ist(&sNC, sSort.
31c30 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
31c40 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
31c50 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
31c60 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
31c70 72 74 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70  rt( pWhere==p->p
31c80 57 68 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20  Where );.       
31c90 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70   havingToWhere(p
31ca0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
31cb0 20 70 48 61 76 69 6e 67 2c 20 26 70 2d 3e 70 57   pHaving, &p->pW
31cc0 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 70  here);.        p
31cd0 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
31ce0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
31cf0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
31d00 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
31d10 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
31d20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
31d30 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
31d40 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
31d50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
31d60 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
31d70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
31d80 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
31d90 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
31da0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
31db0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
31dc0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
31dd0 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
31de0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
31df0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
31e00 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
31e10 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
31e20 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
31e30 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
31e40 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
31e50 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
31e60 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
31e70 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
31e80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
31e90 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
31ea0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
31eb0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
31ec0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
31ed0 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
31ee0 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
31ef0 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
31f00 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
31f10 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
31f20 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
31f30 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
31f40 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
31f50 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
31f60 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
31f70 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
31f80 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
31f90 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20      int addr1;  
31fa0 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
31fb0 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
31fc0 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
31fd0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
31fe0 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
31ff0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
32000 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
32010 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
32020 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
32030 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
32040 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
32050 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
32060 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
32070 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
32080 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
32090 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
320a0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
320b0 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
320c0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
320d0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
320e0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
320f0 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
32100 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
32110 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
32120 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
32130 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
32140 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
32150 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
32160 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
32170 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
32180 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
32190 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
321a0 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
321b0 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
321c0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
321d0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
321e0 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
321f0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
32200 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
32210 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
32220 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
32230 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
32240 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
32250 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
32260 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
32270 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
32280 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
32290 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
322a0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
322b0 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
322c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
322d0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
322e0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
322f0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
32300 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
32310 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
32320 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67  GroupBy, 0, sAgg
32330 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Info.nColumn);. 
32340 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
32350 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
32360 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
32370 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
32380 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
32390 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
323a0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
323b0 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
323c0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
323d0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
323e0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
323f0 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
32400 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
32410 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
32420 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
32430 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
32440 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
32450 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
32460 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
32470 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
32480 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
32490 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
324a0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
324b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
324c0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
324d0 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
324e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
324f0 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
32500 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
32510 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
32520 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
32530 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
32540 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
32550 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
32560 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
32570 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
32580 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
32590 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
325a0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
325b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
325c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
325d0 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
325e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
325f0 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
32600 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
32610 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
32620 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
32630 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
32640 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
32650 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
32660 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
32670 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
32680 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
32690 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
326a0 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
326b0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
326c0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
326d0 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
326e0 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
326f0 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
32700 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
32710 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
32720 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
32730 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
32740 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
32750 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
32760 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
32770 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
32780 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
32790 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
327a0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
327b0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
327c0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
327d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
327e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
327f0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
32800 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
32810 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
32820 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
32830 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
32840 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
32850 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
32860 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
32870 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
32880 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
32890 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
328a0 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
328b0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
328c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
328d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
328e0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
328f0 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
32900 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
32910 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
32920 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
32930 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
32940 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
32950 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
32960 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
32970 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
32980 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
32990 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
329a0 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
329b0 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
329c0 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
329d0 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
329e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
329f0 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
32a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32a10 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
32a20 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
32a30 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
32a40 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
32a50 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
32a60 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
32a70 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
32a80 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
32a90 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
32aa0 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
32ab0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
32ac0 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
32ad0 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
32ae0 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
32af0 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
32b00 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
32b10 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
32b20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
32b30 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
32b40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
32b50 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
32b60 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
32b70 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
32b80 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
32b90 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
32ba0 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
32bb0 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
32bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
32bd0 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
32be0 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
32bf0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
32c00 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
32c10 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
32c20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
32c30 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
32c40 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
32c50 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
32c60 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
32c70 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
32c80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
32c90 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
32ca0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
32cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32cc0 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
32cd0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
32ce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
32cf0 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
32d00 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
32d10 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
32d20 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
32d30 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
32d40 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
32d50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
32d60 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
32d70 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
32d80 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Base, 0, 0);.   
32d90 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
32da0 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
32db0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
32dc0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
32dd0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
32de0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
32df0 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
32e00 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
32e10 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
32e20 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
32e30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
32e40 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
32e50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32e60 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
32e70 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65  lumnToReg(pParse
32e80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
32e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ea0 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43    pCol->pTab, pC
32eb0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f  ol->iColumn, pCo
32ec0 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a  l->iTable, r1);.
32ed0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
32ee0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
32f00 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
32f10 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
32f20 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
32f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
32f40 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
32f50 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
32f60 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
32f70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
32f80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
32f90 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49  terInsert, sAggI
32fa0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
32fb0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
32fc0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
32fd0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
32fe0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
32ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
33000 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
33010 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
33020 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
33030 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
33040 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
33050 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
33060 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61  dxPTab = sortPTa
33070 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
33080 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74  ++;.        sort
33090 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Out = sqlite3Get
330a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
330b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
330c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
330d0 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72  _OpenPseudo, sor
330e0 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20  tPTab, sortOut, 
330f0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
33100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
33110 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
33120 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
33130 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29  ingIdx, addrEnd)
33140 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
33150 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50  mment((v, "GROUP
33160 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62   BY sort")); Vdb
33170 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
33180 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
33190 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
331a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
331b0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
331c0 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
331d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
331e0 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70  he index or temp
331f0 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64  orary table used
33200 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59   by the GROUP BY
33210 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77   sort.      ** w
33220 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65  ill naturally de
33230 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68  liver rows in th
33240 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64  e order required
33250 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59   by the ORDER BY
33260 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
33270 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68  , cancel the eph
33280 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65  emeral table ope
33290 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e  n coded earlier.
332a0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
332b0 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
332c0 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65  timization - the
332d0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
332e0 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65  should result re
332f0 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20  gardless..      
33300 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54  ** Use the SQLIT
33310 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66  E_GroupByOrder f
33320 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f  lag with SQLITE_
33330 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
33340 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ER to .      ** 
33350 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
33360 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
33370 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  sting purposes. 
33380 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72   */.      if( or
33390 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69  derByGrp && Opti
333a0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
333b0 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  db, SQLITE_Group
333c0 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20  ByOrder) .      
333d0 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74   && (groupBySort
333e0 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65   || sqlite3Where
333f0 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29  IsSorted(pWInfo)
33400 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
33410 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
33420 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  y = 0;.        s
33430 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
33440 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
33450 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
33460 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
33470 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  * Evaluate the c
33480 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
33490 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20  terms and store 
334a0 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e  in b0, b1, b2...
334b0 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73  .      ** (b0 is
334c0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
334d0 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20   iBMem+0, b1 is 
334e0 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20  iBMem+1, and so 
334f0 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20  forth).      ** 
33500 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65  Then compare the
33510 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
33520 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20  Y terms against 
33530 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
33540 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ms.      ** from
33550 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
33560 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  w currently stor
33570 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32  ed in a0, a1, a2
33580 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
33590 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70     addrTopOfLoop
335a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
335b0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
335c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
335d0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
335e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  );.      if( gro
335f0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
33600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33610 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
33620 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f  erData, sAggInfo
33630 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  .sortingIdx,.   
33640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33650 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20         sortOut, 
33660 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20  sortPTab);.     
33670 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
33680 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
33690 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
336a0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
336b0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
336c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
336d0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
336e0 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d  sortPTab, j, iBM
336f0 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
33700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
33710 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
33720 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
33730 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
33740 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
33750 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
33760 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
33770 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33790 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
337a0 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
337b0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
337c0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
337d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
337e0 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
337f0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
33800 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
33810 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
33820 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
33830 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
33840 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
33850 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31  , OP_Jump, addr1
33860 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29 3b  +1, 0, addr1+1);
33870 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
33880 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
33890 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
338a0 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
338b0 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
338c0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
338d0 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
338e0 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
338f0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
33900 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
33910 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
33920 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
33930 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
33940 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
33950 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
33960 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
33970 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
33980 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
33990 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
339a0 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
339b0 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
339c0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
339d0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
339e0 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
339f0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
33a00 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
33a10 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
33a20 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
33a30 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
33a40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
33a50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
33a60 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
33a70 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
33a80 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
33a90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33aa0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
33ab0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
33ac0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
33ad0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
33ae0 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
33af0 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
33b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
33b10 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
33b20 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
33b30 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
33b40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
33b50 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
33b60 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
33b70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33b80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
33b90 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
33ba0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
33bb0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
33bc0 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
33bd0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
33be0 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
33bf0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
33c00 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
33c10 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
33c20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
33c30 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
33c40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
33c50 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
33c60 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  ;.      updateAc
33c70 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
33c80 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
33c90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33ca0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
33cb0 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67  ger, 1, iUseFlag
33cc0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
33cd0 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
33ce0 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d  te data in accum
33cf0 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
33d00 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
33d10 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20  loop.      */.  
33d20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
33d30 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
33d40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
33d50 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
33d60 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
33d70 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f  ingIdx, addrTopO
33d80 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  fLoop);.        
33d90 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
33da0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
33dc0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
33dd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33de0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
33df0 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
33e00 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
33e10 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
33e20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
33e30 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
33e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33e50 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
33e60 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
33e70 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
33e80 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
33e90 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
33ea0 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20  nal row"));..   
33eb0 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20     /* Jump over 
33ec0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a  the subroutines.
33ed0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
33ee0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
33ef0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20  , addrEnd);..   
33f00 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
33f10 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
33f20 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c   outputs a singl
33f30 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
33f40 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
33f50 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69  .  This subrouti
33f60 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61  ne first looks a
33f70 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20  t the iUseFlag. 
33f80 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20   If iUseFlag.   
33f90 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68     ** is less th
33fa0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
33fb0 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ero, the subrout
33fc0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
33fd0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   If.      ** the
33fe0 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c   processing call
33ff0 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20  s for the query 
34000 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73  to abort, this s
34010 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
34020 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  ** increments th
34030 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d  e iAbortFlag mem
34040 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66  ory location bef
34050 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ore returning in
34060 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
34070 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61  to signal the ca
34080 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20  ller to abort.. 
34090 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
340a0 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c  drSetAbort = sql
340b0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
340c0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
340d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
340e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
340f0 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
34100 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34110 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20  ((v, "set abort 
34120 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
34130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
34140 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
34150 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
34160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
34170 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
34180 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
34190 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
341a0 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
341b0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
341c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
341d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
341e0 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61  Pos, iUseFlag, a
341f0 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b  ddrOutputRow+2);
34200 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
34210 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
34220 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
34230 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
34240 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f  nerator entry po
34250 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71  int"));.      sq
34260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
34270 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
34280 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
34290 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
342a0 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
342b0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
342c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
342d0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
342e0 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
342f0 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55  Row+1, SQLITE_JU
34300 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
34310 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
34320 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
34330 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72  EList, -1, &sSor
34340 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
34350 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74 69           &sDisti
34360 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
34370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34380 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b    addrOutputRow+
34390 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29  1, addrSetAbort)
343a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
343b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
343c0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
343d0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
343e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
343f0 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74  d groupby result
34400 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a   generator"));..
34410 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
34420 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
34430 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74  hat will reset t
34440 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75  he group-by accu
34450 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f  mulator.      */
34460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34470 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
34480 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
34490 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
344a0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
344b0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
344c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
344d0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
344e0 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a  egReset);.     .
344f0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
34500 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20  GroupBy.  Begin 
34510 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
34520 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20  s without GROUP 
34530 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  BY: */.    else 
34540 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
34550 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e   *pDel = 0;.#ifn
34560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34570 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20  BTREECOUNT.     
34580 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
34590 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
345a0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c  isSimpleCount(p,
345b0 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20   &sAggInfo))!=0 
345c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
345d0 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29   isSimpleCount()
345e0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
345f0 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74  er to a Table st
34600 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20  ructure, then.  
34610 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
34620 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66   statement is of
34630 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20   the form:.     
34640 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
34650 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
34660 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20  *) FROM <tbl>.  
34670 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
34680 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61   ** where the Ta
34690 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65  ble structure re
346a0 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74  turned represent
346b0 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20  s table <tbl>.. 
346c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
346d0 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d    ** This statem
346e0 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e  ent is so common
346f0 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69   that it is opti
34700 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e  mized specially.
34710 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
34720 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63  OP_Count instruc
34730 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64  tion is executed
34740 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69   either on the i
34750 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74  ntkey table that
34760 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
34770 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f  ains the data fo
34780 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72  r table <tbl> or
34790 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69   on one of its i
347a0 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20  ndexes. It.     
347b0 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20     ** is better 
347c0 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f  to execute the o
347d0 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61  p on an index, a
347e0 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c  s indexes are al
347f0 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  most.        ** 
34800 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63  always spread ac
34810 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20  ross less pages 
34820 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65  than their corre
34830 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e  sponding tables.
34840 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
34850 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
34860 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
34870 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
34880 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
34890 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ma);.        con
348a0 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50  st int iCsr = pP
348b0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
348c0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73    /* Cursor to s
348d0 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  can b-tree */.  
348e0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
348f0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
34900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
34910 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
34920 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  */.        KeyIn
34930 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30  fo *pKeyInfo = 0
34940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34950 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73  /* Keyinfo for s
34960 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a  canned index */.
34970 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
34980 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
34990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
349a0 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64  Best index found
349b0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
349c0 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70     int iRoot = p
349d0 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20  Tab->tnum;      
349e0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
349f0 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20  page of scanned 
34a00 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20  b-tree */..     
34a10 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
34a20 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
34a30 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
34a40 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
34a50 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
34a60 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
34a70 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
34a80 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
34a90 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  or the index tha
34aa0 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74  t has the lowest
34ab0 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20   scan cost..    
34ac0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
34ad0 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44  * (2011-04-15) D
34ae0 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20  o not do a full 
34af0 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64  scan of an unord
34b00 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20  ered index..    
34b10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
34b20 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44  * (2013-10-03) D
34b30 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20  o not count the 
34b40 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61 72  entries in a par
34b50 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20  tial index..    
34b60 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
34b70 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68  * In practice th
34b80 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
34b90 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ure will not be 
34ba0 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79  used. It is only
34bb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73   .        ** pas
34bc0 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f  sed to keep OP_O
34bd0 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20  penRead happy.. 
34be0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
34bf0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
34c00 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d 20  pTab) ) pBest = 
34c10 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
34c20 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
34c30 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
34c40 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
34c50 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
34c60 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
34c70 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64  if( pIdx->bUnord
34c80 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20  ered==0.        
34c90 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64     && pIdx->szId
34ca0 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62  xRow<pTab->szTab
34cb0 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  Row.           &
34cc0 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  & pIdx->pPartIdx
34cd0 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20  Where==0.       
34ce0 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20 7c      && (!pBest |
34cf0 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  | pIdx->szIdxRow
34d00 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77  <pBest->szIdxRow
34d10 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
34d20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
34d30 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
34d40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
34d50 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74         if( pBest
34d60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52   ){.          iR
34d70 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75  oot = pBest->tnu
34d80 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  m;.          pKe
34d90 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
34da0 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
34db0 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20  arse, pBest);.  
34dc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
34dd0 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d   /* Open a read-
34de0 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65  only cursor, exe
34df0 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e  cute the OP_Coun
34e00 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72  t, close the cur
34e10 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sor. */.        
34e20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34e30 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  4Int(v, OP_OpenR
34e40 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74  ead, iCsr, iRoot
34e50 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20  , iDb, 1);.     
34e60 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
34e70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
34e80 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
34e90 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29  (v, -1, (char *)
34ea0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
34eb0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d  INFO);.        }
34ec0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34ed0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
34ee0 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41  _Count, iCsr, sA
34ef0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
34f00 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
34f10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
34f20 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43  (v, OP_Close, iC
34f30 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  sr);.        exp
34f40 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
34f50 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42  pParse, pTab, pB
34f60 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
34f70 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
34f80 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
34f90 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20  NT */.      {.  
34fa0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
34fb0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  f the query is o
34fc0 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  f one of the fol
34fd0 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20  lowing forms:.  
34fe0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
34ff0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e   **   SELECT min
35000 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
35010 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
35020 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   max(x) FROM ...
35030 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
35040 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
35050 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f   then ask the co
35060 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f  de in where.c to
35070 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74   attempt to sort
35080 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20   results.       
35090 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20   ** as if there 
350a0 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e  was an "ORDER ON
350b0 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e   x" or "ORDER ON
350c0 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e   x DESC" clause.
350d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20   .        ** If 
350e0 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20  where.c is able 
350f0 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c  to produce resul
35100 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69  ts sorted in thi
35110 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  s order, then.  
35120 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62        ** add vdb
35130 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20  e code to break 
35140 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65  out of the proce
35150 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72  ssing loop after
35160 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
35170 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
35180 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73   (since the firs
35190 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
351a0 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20  he loop is .    
351b0 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65      ** guarantee
351c0 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  d to operate on 
351d0 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65  the row with the
351e0 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69   minimum or maxi
351f0 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  mum .        ** 
35200 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20  value of x, the 
35210 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65  only row require
35220 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  d)..        **. 
35230 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63         ** A spec
35240 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65  ial flag must be
35250 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
35260 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74  e3WhereBegin() t
35270 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20  o slightly.     
35280 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68     ** modify beh
35290 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73  avior as follows
352a0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
352b0 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74       **   + If t
352c0 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53  he query is a "S
352d0 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74  ELECT min(x)", t
352e0 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64  hen the loop cod
352f0 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  ed by.        **
35300 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f       where.c sho
35310 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20  uld not iterate 
35320 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20  over any values 
35330 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75  with a NULL valu
35340 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  e.        **    
35350 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20   for x..        
35360 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
35370 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  + The optimizer 
35380 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
35390 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20  (the thing that 
353a0 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20  decides which.  
353b0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64        **     ind
353c0 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f  ex or indices to
353d0 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61   use) should pla
353e0 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  ce a different p
353f0 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20  riority on .    
35400 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73      **     satis
35410 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52  fying the 'ORDER
35420 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e   BY' clause than
35430 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65   it does in othe
35440 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20  r cases..       
35450 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f   **     Refer to
35460 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e   code and commen
35470 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f  ts in where.c fo
35480 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20  r details..     
35490 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78     */.        Ex
354a0 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20  prList *pMinMax 
354b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
354c0 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44  flag = WHERE_ORD
354d0 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  ERBY_NORMAL;.   
354e0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61 73       .        as
354f0 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
35500 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
35510 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
35520 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
35530 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a  ->pHaving==0 ){.
35540 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
35550 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41   minMaxQuery(&sA
35560 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78  ggInfo, &pMinMax
35570 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35580 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
35590 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78  g==0 || (pMinMax
355a0 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e  !=0 && pMinMax->
355b0 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20  nExpr==1) );..  
355c0 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29        if( flag )
355d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  {.          pMin
355e0 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Max = sqlite3Exp
355f0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69  rListDup(db, pMi
35600 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  nMax, 0);.      
35610 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
35620 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ax;.          as
35630 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
35640 46 61 69 6c 65 64 20 7c 7c 20 70 4d 69 6e 4d 61  Failed || pMinMa
35650 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x!=0 );.        
35660 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
35670 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
35680 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
35690 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
356a0 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44   flag!=WHERE_ORD
356b0 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20  ERBY_MIN ?1:0;. 
356c0 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
356d0 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  ax->a[0].pExpr->
356e0 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
356f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35700 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
35710 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
35720 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
35730 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
35740 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
35750 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
35760 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73  essing is much s
35770 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65  impler since the
35780 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
35790 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20  gle row.        
357a0 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
357b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
357c0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
357d0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
357e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57  nfo);.        pW
357f0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
35800 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
35810 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
35820 65 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 2c 66 6c  e, pMinMax, 0,fl
35830 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ag,0);.        i
35840 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
35850 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35860 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
35870 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
35880 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
35890 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
358a0 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
358b0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
358c0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
358d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
358e0 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e  inMax==0 || pMin
358f0 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  Max->nExpr==1 );
35900 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
35910 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
35920 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a  ed(pWInfo)>0 ){.
35930 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35940 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c  3VdbeGoto(v, sql
35950 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
35960 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20  bel(pWInfo));.  
35970 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
35980 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
35990 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
359a0 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
359b0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
359c0 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
359d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
359e0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
359f0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
35a00 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
35a10 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
35a20 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
35a30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f      }..      sSo
35a40 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
35a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
35a60 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
35a70 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
35a80 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
35a90 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
35aa0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
35ab0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
35ac0 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20  st, -1, 0, 0, . 
35ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ae0 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
35af0 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
35b00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
35b10 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
35b20 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
35b30 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
35b40 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
35b50 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
35b60 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
35b70 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
35b80 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
35b90 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
35ba0 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
35bb0 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
35bc0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
35bd0 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
35be0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
35bf0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
35c00 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
35c10 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
35c20 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
35c30 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
35c40 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
35c50 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
35c60 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
35c70 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
35c80 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a  mpTable(pParse,.
35c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ca0 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
35cb0 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
35cc0 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
35cd0 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
35ce0 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
35cf0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
35d00 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
35d10 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
35d20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
35d30 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
35d40 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
35d50 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
35d60 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
35d70 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
35d80 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
35d90 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
35da0 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
35db0 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
35dc0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
35dd0 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
35de0 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
35df0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
35e00 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
35e10 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
35e20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
35e30 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
35e40 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
35e50 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
35e60 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
35e70 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
35e80 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
35e90 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
35ea0 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
35eb0 65 63 74 49 64 29 3b 0a 0a 20 20 73 71 6c 69 74  ectId);..  sqlit
35ec0 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
35ed0 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
35ee0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
35ef0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29   sAggInfo.aFunc)
35f00 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
35f10 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45  E_ENABLED.  SELE
35f20 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
35f30 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73  ,p,("end process
35f40 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72  ing\n"));.  pPar
35f50 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
35f60 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  t--;.#endif.  re
35f70 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.