/ Hex Artifact Content
Login

Artifact f02352ac5cbb6fad3804add825743b924cfb6c742ba2e8666d726828a9985d73:


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 69 66  >pLimit);.    if
0ad0: 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
0ae0: 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20 29 20  RUE(p->pWith) ) 
0af0: 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
0b00: 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  e(db, p->pWith);
0b10: 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
0b20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
0b30: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d  (db, p);.    p =
0b40: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62 46 72   pPrior;.    bFr
0b50: 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ee = 1;.  }.}../
0b60: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0b70: 61 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  a SelectDest str
0b80: 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
0b90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
0ba0: 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74  tInit(SelectDest
0bb0: 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65   *pDest, int eDe
0bc0: 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
0bd0: 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d    pDest->eDest =
0be0: 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44   (u8)eDest;.  pD
0bf0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69  est->iSDParm = i
0c00: 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 7a  Parm;.  pDest->z
0c10: 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  AffSdst = 0;.  p
0c20: 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b  Dest->iSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
0c40: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
0c50: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
0c60: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61  lect structure a
0c70: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
0c80: 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73  ter to that.** s
0c90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c  tructure..*/.Sel
0ca0: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
0cb0: 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65 20 2a  ctNew(.  Parse *
0cc0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
0cd0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0ce0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
0cf0: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20  *pEList,     /* 
0d00: 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f  which columns to
0d10: 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65 20   include in the 
0d20: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c  result */.  SrcL
0d30: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
0d40: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
0d50: 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74 61  ause -- which ta
0d60: 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a  bles to scan */.
0d70: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
0d80: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
0d90: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
0da0: 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
0db0: 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47 52  pBy,   /* the GR
0dc0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
0dd0: 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
0de0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0df0: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f  HAVING clause */
0e00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
0e10: 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  derBy,   /* the 
0e20: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
0e30: 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c 61 67  */.  u32 selFlag
0e40: 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s,         /* Fl
0e50: 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c 20 73  ag parameters, s
0e60: 75 63 68 20 61 73 20 53 46 5f 44 69 73 74 69 6e  uch as SF_Distin
0e70: 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  ct */.  Expr *pL
0e80: 69 6d 69 74 20 20 20 20 20 20 20 20 20 20 2f 2a  imit          /*
0e90: 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e   LIMIT value.  N
0ea0: 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73  ULL means not us
0eb0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ed */.){.  Selec
0ec0: 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
0ed0: 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70 4e 65  t standin;.  pNe
0ee0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
0ef0: 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d  locRawNN(pParse-
0f00: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  >db, sizeof(*pNe
0f10: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
0f20: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
0f30: 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
0f40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
0f50: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0f60: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  in;.  }.  if( pE
0f70: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
0f80: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
0f90: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
0fa0: 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  arse, 0,.       
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
0fd0: 74 65 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e  te3Expr(pParse->
0fe0: 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b 2c 30  db,TK_ASTERISK,0
0ff0: 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  ));.  }.  pNew->
1000: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
1010: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
1020: 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d  _SELECT;.  pNew-
1030: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65 6c 46  >selFlags = selF
1040: 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  lags;.  pNew->iL
1050: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
1060: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 23  ->iOffset = 0;.#
1070: 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
1080: 4e 41 42 4c 45 44 0a 20 20 70 4e 65 77 2d 3e 7a  NABLED.  pNew->z
1090: 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  SelName[0] = 0;.
10a0: 23 65 6e 64 69 66 0a 20 20 70 4e 65 77 2d 3e 61  #endif.  pNew->a
10b0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
10c0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
10d0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
10e0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65  1;.  pNew->nSele
10f0: 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28  ctRow = 0;.  if(
1100: 20 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20   pSrc==0 ) pSrc 
1110: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1120: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
1130: 2c 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  , sizeof(*pSrc))
1140: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
1150: 20 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70   pSrc;.  pNew->p
1160: 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
1170: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
1180: 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70   = pGroupBy;.  p
1190: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  New->pHaving = p
11a0: 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e  Having;.  pNew->
11b0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
11c0: 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  rBy;.  pNew->pPr
11d0: 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ior = 0;.  pNew-
11e0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e  >pNext = 0;.  pN
11f0: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69  ew->pLimit = pLi
1200: 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69  mit;.  pNew->pWi
1210: 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  th = 0;.  if( pP
1220: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1230: 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63  Failed ) {.    c
1240: 6c 65 61 72 53 65 6c 65 63 74 28 70 50 61 72 73  learSelect(pPars
1250: 65 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  e->db, pNew, pNe
1260: 77 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20  w!=&standin);.  
1270: 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65    pNew = 0;.  }e
1280: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
1290: 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c   pNew->pSrc!=0 |
12a0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
12b0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
12c0: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
12d0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   );.  return pNe
12e0: 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54  w;.}..#if SELECT
12f0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
1300: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
1310: 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f 62 6a   of a Select obj
1320: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
1330: 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
1340: 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73  (Select *p, cons
1350: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1360: 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61 6d 65    if( p && zName
1370: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1380: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1390: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d  p->zSelName), p-
13a0: 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c  >zSelName, "%s",
13b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23   zName);.  }.}.#
13c0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
13d0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
13e0: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
13f0: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
1400: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
1410: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
1420: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
1430: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
1440: 29 7b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41  ){.  if( OK_IF_A
1450: 4c 57 41 59 53 5f 54 52 55 45 28 70 29 20 29 20  LWAYS_TRUE(p) ) 
1460: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
1470: 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 1);.}../*.** 
1480: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1490: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
14a0: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
14b0: 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  ent in a compoun
14c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c  d..*/.static Sel
14d0: 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f  ect *findRightmo
14e0: 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  st(Select *p){. 
14f0: 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74   while( p->pNext
1500: 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   ) p = p->pNext;
1510: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
1520: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f  /*.** Given 1 to
1530: 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70   3 identifiers p
1540: 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  receding the JOI
1550: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
1560: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
1570: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
1580: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
1590: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
15a0: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
15b0: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
15c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
15d0: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
15e0: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
15f0: 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20    JT_CROSS.**   
1600: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
1610: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
1620: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
1630: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
1640: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
1650: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
1660: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
1670: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
1680: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
1690: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
16a0: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
16b0: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
16c0: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
16d0: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
16e0: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
16f0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
1700: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1710: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
1720: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1730: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
1740: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
1750: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1760: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
1770: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20  .  Token *p;.   
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 30            /*   0
17a0: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
17b0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
17c0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
17d0: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65 78  nst char zKeyTex
17e0: 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65 66  t[] = "naturalef
17f0: 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69 6e  touterightfullin
1800: 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74 61  nercross";.  sta
1810: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
1820: 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20 20   {.    u8 i;    
1830: 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
1840: 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78 74   of keyword text
1850: 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a   in zKeyText[] *
1860: 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b 20  /.    u8 nChar; 
1870: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
1880: 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20 63  the keyword in c
1890: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20  haracters */.   
18a0: 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a   u8 code;     /*
18b0: 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b 20   Join type mask 
18c0: 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b  */.  } aKeyword[
18d0: 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74  ] = {.    /* nat
18e0: 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c  ural */ { 0,  7,
18f0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20 20   JT_NATURAL     
1900: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1910: 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20    /* left    */ 
1920: 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54  { 6,  4, JT_LEFT
1930: 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20  |JT_OUTER       
1940: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74     },.    /* out
1950: 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c  er   */ { 10, 5,
1960: 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20   JT_OUTER       
1970: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1980: 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f 20    /* right   */ 
1990: 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48  { 14, 5, JT_RIGH
19a0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
19b0: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c     },.    /* ful
19c0: 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c  l    */ { 19, 4,
19d0: 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48   JT_LEFT|JT_RIGH
19e0: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
19f0: 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20    /* inner   */ 
1a00: 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45  { 23, 5, JT_INNE
1a10: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1a20: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f     },.    /* cro
1a30: 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c  ss   */ { 28, 5,
1a40: 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f   JT_INNER|JT_CRO
1a50: 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  SS         },.  
1a60: 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  };.  int i, j;. 
1a70: 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a   apAll[0] = pA;.
1a80: 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b    apAll[1] = pB;
1a90: 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43  .  apAll[2] = pC
1aa0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
1ab0: 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b   && apAll[i]; i+
1ac0: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c  +){.    p = apAl
1ad0: 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  l[i];.    for(j=
1ae0: 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61  0; j<ArraySize(a
1af0: 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a  Keyword); j++){.
1b00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
1b10: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61  aKeyword[j].nCha
1b20: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
1b30: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1b40: 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b  (char*)p->z, &zK
1b50: 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b  eyText[aKeyword[
1b60: 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20  j].i], p->n)==0 
1b70: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
1b80: 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b  ype |= aKeyword[
1b90: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
1ba0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1bb0: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
1bc0: 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31  se( j==0 || j==1
1bd0: 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33   || j==2 || j==3
1be0: 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35   || j==4 || j==5
1bf0: 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20   || j==6 );.    
1c00: 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65  if( j>=ArraySize
1c10: 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20 20  (aKeyword) ){.  
1c20: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1c30: 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  JT_ERROR;.      
1c40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1c50: 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69  .  if(.     (joi
1c60: 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45  ntype & (JT_INNE
1c70: 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a  R|JT_OUTER))==(J
1c80: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1c90: 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74  ) ||.     (joint
1ca0: 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21  ype & JT_ERROR)!
1cb0: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  =0.  ){.    cons
1cc0: 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20  t char *zSp = " 
1cd0: 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ";.    assert( p
1ce0: 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  B!=0 );.    if( 
1cf0: 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20  pC==0 ){ zSp++; 
1d00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
1d10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1d20: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
1d30: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
1d40: 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25 54   ".       "%T %T
1d50: 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a  %s%T", pA, pB, z
1d60: 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69  Sp, pC);.    joi
1d70: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1d80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6a  ;.  }else if( (j
1d90: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1da0: 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ER)!=0 .        
1db0: 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26 20   && (jointype & 
1dc0: 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48  (JT_LEFT|JT_RIGH
1dd0: 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a  T))!=JT_LEFT ){.
1de0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1df0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1e00: 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55     "RIGHT and FU
1e10: 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61  LL OUTER JOINs a
1e20: 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  re not currently
1e30: 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
1e40: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
1e50: 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  INNER;.  }.  ret
1e60: 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a  urn jointype;.}.
1e70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1e80: 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c  e index of a col
1e90: 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20  umn in a table. 
1ea0: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68   Return -1 if th
1eb0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e  e column.** is n
1ec0: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1ed0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
1ee0: 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49  atic int columnI
1ef0: 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62  ndex(Table *pTab
1f00: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
1f10: 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
1f20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
1f30: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1f40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1f50: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  Cmp(pTab->aCol[i
1f60: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
1f70: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1f80: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1f90: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
1fa0: 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c 65  he first N table
1fb0: 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20  s in pSrc, from 
1fc0: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 6c  left to right, l
1fd0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20  ooking for a.** 
1fe0: 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20 61  table that has a
1ff0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43   column named zC
2000: 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ol.  .**.** When
2010: 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69 54   found, set *piT
2020: 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f  ab and *piCol to
2030: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65 78   the table index
2040: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65   and column inde
2050: 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74 63  x.** of the matc
2060: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  hing column and 
2070: 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a  return TRUE..**.
2080: 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  ** If not found,
2090: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a   return FALSE..*
20a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61 62  /.static int tab
20b0: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
20c0: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
20d0: 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  c,       /* Arra
20e0: 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  y of tables to s
20f0: 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e  earch */.  int N
2100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2110: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62  /* Number of tab
2120: 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d  les in pSrc->a[]
2130: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2140: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
2150: 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ,    /* Name of 
2160: 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72  the column we ar
2170: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f  e looking for */
2180: 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20 20  .  int *piTab,  
2190: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
21a0: 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e   index of pSrc->
21b0: 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  a[] here */.  in
21c0: 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20 20  t *piCol        
21d0: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
21e0: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69  x of pSrc->a[*pi
21f0: 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Tab].pTab->aCol[
2200: 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ] here */.){.  i
2210: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2220: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
2230: 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
2240: 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  n pSrc */.  int 
2250: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
2260: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2270: 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f  umn matching zCo
2280: 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  l */..  assert( 
2290: 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43  (piTab==0)==(piC
22a0: 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f  ol==0) );  /* Bo
22b0: 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61 72  th or neither ar
22c0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28  e NULL */.  for(
22d0: 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a  i=0; i<N; i++){.
22e0: 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d      iCol = colum
22f0: 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b 69  nIndex(pSrc->a[i
2300: 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20  ].pTab, zCol);. 
2310: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
2320: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54 61  {.      if( piTa
2330: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69  b ){.        *pi
2340: 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  Tab = i;.       
2350: 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a   *piCol = iCol;.
2360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2370: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2380: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2390: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
23a0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
23b0: 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69 65  add terms implie
23c0: 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78  d by JOIN syntax
23d0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
23e0: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
23f0: 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  on of a SELECT s
2400: 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65  tatement. The ne
2410: 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a  w term, which.**
2420: 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20 74   is ANDed with t
2430: 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45 52  he existing WHER
2440: 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66 20  E clause, is of 
2450: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
2460: 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20     (tab1.col1 = 
2470: 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a  tab2.col2).**.**
2480: 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20 74   where tab1 is t
2490: 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c 65  he iSrc'th table
24a0: 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63   in SrcList pSrc
24b0: 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68 65   and tab2 is the
24c0: 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74 68   .** (iSrc+1)'th
24d0: 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73  . Column col1 is
24e0: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74   column iColLeft
24f0: 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63 6f   of tab1, and co
2500: 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  l2 is.** column 
2510: 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61 62  iColRight of tab
2520: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
2530: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
2540: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
2570: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
2580: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
2590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
25a0: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 46  t of tables in F
25b0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
25c0: 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20 20  int iLeft,      
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
25f0: 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20  t table to join 
2600: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2610: 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20   iColLeft,      
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2630: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
2640: 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 2a  in first table *
2650: 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c 20  /.  int iRight, 
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2680: 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20  second table in 
2690: 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43  pSrc */.  int iC
26a0: 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  olRight,        
26b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
26c0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
26d0: 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a  second table */.
26e0: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69    int isOuterJoi
26f0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2700: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2710: 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f  s is an OUTER jo
2720: 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  in */.  Expr **p
2730: 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20  pWhere          
2740: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2750: 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  T: The WHERE cla
2760: 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f  use to add to */
2770: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2780: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2790: 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20 45    Expr *pE1;.  E
27a0: 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70 72  xpr *pE2;.  Expr
27b0: 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72 74   *pEq;..  assert
27c0: 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20 29  ( iLeft<iRight )
27d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
27e0: 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29 3b  ->nSrc>iRight );
27f0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
2800: 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20 29  >a[iLeft].pTab )
2810: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2820: 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61 62  ->a[iRight].pTab
2830: 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c   );..  pE1 = sql
2840: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2850: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2860: 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b  Left, iColLeft);
2870: 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65 33  .  pE2 = sqlite3
2880: 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72  CreateColumnExpr
2890: 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67 68  (db, pSrc, iRigh
28a0: 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a  t, iColRight);..
28b0: 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33 50    pEq = sqlite3P
28c0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
28d0: 45 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a 20  EQ, pE1, pE2);. 
28e0: 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75   if( pEq && isOu
28f0: 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45  terJoin ){.    E
2900: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2910: 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  Eq, EP_FromJoin)
2920: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2930: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2940: 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  Eq, EP_TokenOnly
2950: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2960: 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
2970: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e  operty(pEq, EP_N
2980: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45  oReduce);.    pE
2990: 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  q->iRightJoinTab
29a0: 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69  le = (i16)pE2->i
29b0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70  Table;.  }.  *pp
29c0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
29d0: 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68  xprAnd(db, *ppWh
29e0: 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a  ere, pEq);.}../*
29f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
2a00: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2a10: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
2a20: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
2a30: 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65  ssion..** And se
2a40: 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68  t the Expr.iRigh
2a50: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54  tJoinTable to iT
2a60: 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74  able for every t
2a70: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  erm in the.** ex
2a80: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
2a90: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
2aa0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
2ab0: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
2ac0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
2ad0: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
2ae0: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
2af0: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
2b00: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
2b10: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
2b20: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
2b30: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
2b40: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2b50: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
2b60: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
2b70: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
2b80: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
2b90: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
2ba0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
2bb0: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
2bc0: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
2bd0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
2be0: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
2bf0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
2c00: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2c10: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
2c20: 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  The Expr.iRightJ
2c30: 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74  oinTable tells t
2c40: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2c50: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
2c60: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2c70: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62  n depends on tab
2c80: 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  le iRightJoinTab
2c90: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  le even if that 
2ca0: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
2cb0: 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69  explicitly menti
2cc0: 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  oned in the expr
2cd0: 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e  ession.  That in
2ce0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
2cf0: 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73  ded.** for cases
2d00: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
2d10: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
2d20: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2d30: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
2d40: 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a  AND t1.x=5.**.**
2d50: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
2d60: 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72  e needs to defer
2d70: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
2d80: 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74   the t1.x=5.** t
2d90: 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20  erm until after 
2da0: 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74  the t2 loop of t
2db0: 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61  he join.  In tha
2dc0: 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c  t way, a.** NULL
2dd0: 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   t2 row will be 
2de0: 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65  inserted wheneve
2df0: 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77  r t1.x!=5.  If w
2e00: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65  e do not.** defe
2e10: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2e20: 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c  f t1.x=5, it wil
2e30: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  l be processed i
2e40: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
2e50: 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ter the t1 loop 
2e60: 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31  and rows with t1
2e70: 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72  .x!=5 will never
2e80: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
2e90: 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20  e output, which 
2ea0: 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f  is incorrect..*/
2eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
2ec0: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
2ed0: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2ee0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2ef0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2f00: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
2f10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2f20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2f30: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2f40: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2f50: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2f60: 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64  erty(p, EP_NoRed
2f70: 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69  uce);.    p->iRi
2f80: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2f90: 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20  i16)iTable;.    
2fa0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55  if( p->op==TK_FU
2fb0: 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70  NCTION && p->x.p
2fc0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  List ){.      in
2fd0: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
2fe0: 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74  =0; i<p->x.pList
2ff0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
3000: 20 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78         setJoinEx
3010: 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  pr(p->x.pList->a
3020: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
3030: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
3040: 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70  }.    setJoinExp
3050: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
3060: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
3070: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
3080: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3090: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
30a0: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
30b0: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
30c0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
30d0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
30e0: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
30f0: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
3100: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
3110: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
3120: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
3130: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
3140: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
3150: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
3160: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
3170: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
3180: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
3190: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
31a0: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
31b0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
31c0: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
31d0: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
31e0: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
31f0: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
3200: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
3210: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
3220: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
3230: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
3240: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
3250: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
3260: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
3270: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
3280: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
3290: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
32a0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
32b0: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
32c0: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
32d0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
32e0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
32f0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
3300: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
3310: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
3320: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3330: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
3340: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3350: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
3360: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3380: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
3390: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
33a0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
33d0: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
33e0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
33f0: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
3400: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
3410: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
3420: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3430: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
3440: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
3450: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
3460: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
3470: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
3480: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
3490: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
34a0: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
34b0: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
34c0: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
34d0: 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61   Table *pRightTa
34e0: 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62  b = pRight->pTab
34f0: 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65  ;.    int isOute
3500: 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45  r;..    if( NEVE
3510: 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30  R(pLeft->pTab==0
3520: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
3530: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
3540: 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69    isOuter = (pRi
3550: 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  ght->fg.jointype
3560: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b   & JT_OUTER)!=0;
3570: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
3580: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
3590: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
35a0: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
35b0: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
35c0: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
35d0: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
35e0: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
35f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3600: 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74  pRight->fg.joint
3610: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
3620: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
3630: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
3640: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3660: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3670: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
3680: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
3690: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
36a0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
36b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
36c0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
36d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
36e0: 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c  <pRightTab->nCol
36f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3700: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
3710: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e  * Name of column
3720: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   in the right ta
3730: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
3740: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a  nt iLeft;     /*
3750: 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74   Matching left t
3760: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3770: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f  int iLeftCol;  /
3780: 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  * Matching colum
3790: 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  n in the left ta
37a0: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ble */..        
37b0: 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61  zName = pRightTa
37c0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
37d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61  ;.        if( ta
37e0: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
37f0: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3800: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
3810: 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  ftCol) ){.      
3820: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
3830: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
3840: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
3850: 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20  i+1, j,.        
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3870: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3880: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
3890: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
38a0: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
38b0: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
38c0: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
38d0: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
38e0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
38f0: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
3900: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
3910: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3920: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
3930: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
3940: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
3950: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
3960: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
3970: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3980: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
3990: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
39a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
39b0: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
39c0: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
39d0: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
39e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
39f0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
3a00: 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65        if( isOute
3a10: 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  r ) setJoinExpr(
3a20: 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69  pRight->pOn, pRi
3a30: 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ght->iCursor);. 
3a40: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
3a50: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
3a60: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3a70: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
3a80: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
3a90: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
3aa0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3ab0: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
3ac0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3ad0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3ae0: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
3af0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
3b00: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
3b10: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
3b20: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
3b30: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
3b40: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
3b50: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
3b60: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
3b70: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
3b80: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3b90: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
3ba0: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
3bb0: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
3bc0: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
3bd0: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
3be0: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
3bf0: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
3c00: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
3c10: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
3c20: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
3c30: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
3c40: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3c50: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
3c60: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
3c70: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
3c80: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
3c90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3ca0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
3cb0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3cc0: 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47  erm in the USING
3cd0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
3ce0: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
3cf0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20      /* Table on 
3d00: 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61  the left with ma
3d10: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
3d20: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
3d30: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f  t iLeftCol;    /
3d40: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
3d50: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
3d60: 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  mn on the left *
3d70: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
3d80: 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f  ightCol;   /* Co
3d90: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
3da0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
3db0: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a  n the right */..
3dc0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3dd0: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
3de0: 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  e;.        iRigh
3df0: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
3e00: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
3e10: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
3e20: 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20  ( iRightCol<0.  
3e30: 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65         || !table
3e40: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
3e50: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
3e60: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
3e70: 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ol).        ){. 
3e80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3e90: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3ea0: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
3eb0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
3ec0: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
3ed0: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
3ee0: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
3ef0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
3f00: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3f10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3f20: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
3f30: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
3f40: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
3f50: 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20  , iRightCol,.   
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
3f80: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
3f90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3fa0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
3fb0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3fc0: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
3fd0: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
3fe0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
3ff0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
4000: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
4010: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
4020: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
4030: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
4040: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
4050: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
4060: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
4070: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
4080: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
4090: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
40a0: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
40b0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
40c0: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
40d0: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a   the end */.);..
40e0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
40f0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
4100: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
4110: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
4120: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
4130: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
4140: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
4150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
4160: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
4170: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4180: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
4190: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
41a0: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
41b0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
41c0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
41d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
41e0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
41f0: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
4200: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
4210: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
4220: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
4230: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
4240: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
4250: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
4260: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
4270: 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46  Data,       /* F
4280: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
4290: 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72  lding data befor
42a0: 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69  e packing */.  i
42b0: 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20  nt nData,       
42c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
42d0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
42e0: 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f  he data array */
42f0: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65  .  int nPrefixRe
4300: 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e  g         /* No.
4310: 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f   of reg prior to
4320: 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62   regData availab
4330: 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b  le for use */.){
4340: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4350: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65      /* Stmt unde
4380: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
4390: 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28  /.  int bSeq = (
43a0: 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67  (pSort->sortFlag
43b0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
43c0: 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69  Sorter)==0);.  i
43d0: 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74  nt nExpr = pSort
43e0: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
43f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
4400: 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20  /* No. of ORDER 
4410: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  BY terms */.  in
4420: 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20  t nBase = nExpr 
4430: 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20  + bSeq + nData; 
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4450: 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74  * Fields in sort
4460: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4470: 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74  /* Regs for sort
44b0: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
44c0: 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b  nt regRecord = +
44d0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72  /* Assembled sor
4500: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4510: 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f  int nOBSat = pSo
4520: 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20  rt->nOBSat;     
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   /* ORDER BY ter
4550: 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ms to skip */.  
4560: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20     /* Opcode to 
4590: 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  add sorter recor
45a0: 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20  d to sorter */. 
45b0: 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20   int iLimit;    
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75      /* LIMIT cou
45e0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
45f0: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
4600: 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  eq==1 );.  asser
4610: 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72  t( nData==1 || r
4620: 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44  egData==regOrigD
4630: 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61  ata || regOrigDa
4640: 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ta==0 );.  if( n
4650: 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20  PrefixReg ){.   
4660: 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78   assert( nPrefix
4670: 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20  Reg==nExpr+bSeq 
4680: 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  );.    regBase =
4690: 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72   regData - nExpr
46a0: 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65   - bSeq;.  }else
46b0: 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  {.    regBase = 
46c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
46d0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
46e0: 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d  em += nBase;.  }
46f0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
4700: 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c  ct->iOffset==0 |
4710: 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  | pSelect->iLimi
4720: 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74  t!=0 );.  iLimit
4730: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
4740: 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69  set ? pSelect->i
4750: 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65  Offset+1 : pSele
4760: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53  ct->iLimit;.  pS
4770: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d  ort->labelDone =
4780: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4790: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69  Label(v);.  sqli
47a0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
47b0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
47c0: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67  t->pOrderBy, reg
47d0: 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74  Base, regOrigDat
47e0: 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a,.             
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
4800: 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28  ITE_ECEL_DUP | (
4810: 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c  regOrigData? SQL
4820: 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30  ITE_ECEL_REF : 0
4830: 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29  ));.  if( bSeq )
4840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
4850: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
4860: 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69  quence, pSort->i
4870: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
4880: 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69  +nExpr);.  }.  i
4890: 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30  f( nPrefixReg==0
48a0: 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20   && nData>0 ){. 
48b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
48c0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
48d0: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
48e0: 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74  nExpr+bSeq, nDat
48f0: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
4900: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4910: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4920: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4930: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4940: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4950: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4960: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4970: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4980: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4990: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
49a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
49b0: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
49c0: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
49d0: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
49e0: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
49f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4a00: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
4a10: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
4a20: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4a30: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4a40: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4a50: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4a60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4a70: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4a80: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4a90: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4aa0: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4ab0: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4ac0: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
4ad0: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
4ae0: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
4af0: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
4b00: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
4b10: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
4b20: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4b30: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4b40: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4b50: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4b60: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4b70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4b80: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4b90: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4ba0: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4bb0: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4bc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4bd0: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
4be0: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
4bf0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
4c00: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
4c10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4c20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4c30: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4c40: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4c50: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4c60: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4c70: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4c80: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4c90: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4ca0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4cb0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4cc0: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
4cd0: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
4ce0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
4cf0: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
4d00: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
4d10: 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65   0, pKI->nKeyFie
4d20: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
4d30: 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a  _Jump testable *
4d40: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
4d50: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
4d60: 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f   (char*)pKI, P4_
4d70: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65  KEYINFO);.    te
4d80: 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c  stcase( pKI->nAl
4d90: 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b  lField > pKI->nK
4da0: 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20  eyField+2 );.   
4db0: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4dc0: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
4dd0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4de0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4df0: 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20   nOBSat,.       
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65      pKI->nAllFie
4e30: 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  ld-pKI->nKeyFiel
4e40: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
4e50: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
4e60: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
4e70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4e80: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
4e90: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
4ea0: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
4eb0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4ec0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
4ed0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
4ee0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
4ef0: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4f00: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
4f10: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
4f20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4f30: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
4f40: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
4f50: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
4f60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f70: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
4f80: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
4f90: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
4fa0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
4fb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4fc0: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
4fd0: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
4fe0: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
4ff0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5000: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5010: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5020: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
5030: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5040: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
5050: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
5060: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
5070: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5080: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5090: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
50a0: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
50b0: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
50c0: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
50d0: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
50e0: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
50f0: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
5100: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
5110: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5120: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
5130: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
5140: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
5150: 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73            regBas
5160: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
5170: 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69  nOBSat);.  if( i
5180: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
5190: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72   addr;.    int r
51a0: 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69  1 = 0;.    /* Fi
51b0: 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e  ll the sorter un
51c0: 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  til it contains 
51d0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74  LIMIT+OFFSET ent
51e0: 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d  ries.  (The iLim
51f0: 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  it.    ** regist
5200: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
5210: 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20  d with value of 
5220: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20  LIMIT+OFFSET.)  
5230: 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72  After the sorter
5240: 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70  .    ** fills up
5250: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61  , delete the lea
5260: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
5270: 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63  sorter after eac
5280: 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a  h insert..    **
5290: 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68   Thus we never h
52a0: 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  old more than th
52b0: 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72  e LIMIT+OFFSET r
52c0: 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74  ows in memory at
52d0: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64   once */.    add
52e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
52f0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
5300: 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20  tZero, iLimit); 
5310: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5320: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5330: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
5340: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
5350: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
5360: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5370: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5380: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
5390: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
53a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
53b0: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
53c0: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
53d0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
53e0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
53f0: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
5400: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5410: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
5420: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
5430: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
5440: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
5450: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
5460: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5470: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5480: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
5490: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
54a0: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
54b0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
54c0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
54d0: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
54e0: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
54f0: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
5500: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
5510: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
5520: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
5530: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
5540: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
5550: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
5560: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5570: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5580: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
5590: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
55a0: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
55b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
55c0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
55d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
55e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
55f0: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
5600: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
5610: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5620: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
5630: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
5640: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5650: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5660: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5670: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
5680: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
5690: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
56a0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
56b0: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
56c0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
56d0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
56e0: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
56f0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
5700: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
5710: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
5720: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
5730: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
5740: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
5750: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
5760: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5770: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5780: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
5790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
57a0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
57b0: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
57c0: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
57d0: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
57e0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
57f0: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5800: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
5810: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
5820: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
5830: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
5840: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
5850: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
5860: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5870: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5880: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
5890: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
58a0: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
58b0: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
58c0: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
58d0: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
58e0: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
58f0: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
5900: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
5910: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
5920: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
5930: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
5940: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
5950: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
5960: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
5970: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
5980: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
5990: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
59a0: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
59b0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
59c0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
59d0: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
59e0: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
59f0: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
5a00: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
5a10: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
5a20: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
5a30: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
5a40: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
5a50: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
5a60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5a70: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
5a80: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
5a90: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
5aa0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
5ab0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
5ac0: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
5ad0: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
5ae0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5af0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
5b00: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5b10: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
5b20: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
5b30: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
5b40: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
5b50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5b60: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5b70: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
5b80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5b90: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
5ba0: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20  sert, iTab, r1, 
5bb0: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
5bc0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5bd0: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
5be0: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
5bf0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5c00: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
5c10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5c20: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5c30: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5c40: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5c50: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5c60: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5c70: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
5c80: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
5c90: 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  ->pEList express
5ca0: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
5cb0: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
5cc0: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
5cd0: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
5ce0: 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65   srcTab is.** ze
5cf0: 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e  ro or more, then
5d00: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
5d10: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
5d20: 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65  p->pEList is use
5d30: 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65  d only .** to ge
5d40: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
5d50: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
5d60: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
5d70: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
5d80: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
5d90: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
5da0: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
5db0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
5dc0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
5dd0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
5de0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
5df0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
5e00: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
5e10: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
5e20: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
5e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
5e40: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
5e50: 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e  s table if non-n
5e60: 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72  egative */.  Sor
5e70: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
5e80: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
5e90: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
5ea0: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
5eb0: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
5ec0: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
5ed0: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
5ee0: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5ef0: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
5f00: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
5f10: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
5f20: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
5f30: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
5f40: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
5f50: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
5f60: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
5f70: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
5f80: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
5f90: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
5fa0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5fb0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
5fc0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
5fd0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5fe0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5ff0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
6000: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
6010: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6020: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
6030: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
6040: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
6050: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
6060: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
6070: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
6080: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
6090: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
60a0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
60b0: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
60c0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
60d0: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
60e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
60f0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
6100: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
6110: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
6120: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
6130: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
6140: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
6150: 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  */..  /* Usually
6160: 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73 20 74  , regResult is t
6170: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  he first cell in
6180: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d   an array of mem
6190: 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63  ory cells.  ** c
61a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
61b0: 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77  rrent result row
61c0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
61d0: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
61e0: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76   the.  ** same v
61f0: 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  alue. However, i
6200: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
6210: 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20  e being sent to 
6220: 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a  the sorter, the.
6230: 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20    ** values for 
6240: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20  any expressions 
6250: 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61  that are also pa
6260: 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b  rt of the sort-k
6270: 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20  ey are omitted. 
6280: 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72   ** from this ar
6290: 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ray. In this cas
62a0: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
62b0: 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20   to zero.  */.  
62c0: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
62e0: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
62f0: 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72  olding current r
6300: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6310: 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20  regOrig;        
6320: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
6330: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
6340: 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28  ng full result (
6350: 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65  or 0) */..  asse
6360: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
6370: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
6380: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
6390: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
63a0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
63b0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
63c0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
63d0: 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d   pSort && pSort-
63e0: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70  >pOrderBy==0 ) p
63f0: 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Sort = 0;.  if( 
6400: 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73  pSort==0 && !has
6410: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
6420: 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75  assert( iContinu
6430: 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65  e!=0 );.    code
6440: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
6450: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
6460: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
6470: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
6480: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e  olumns..  */.  n
6490: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70  ResultCol = p->p
64a0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
64b0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
64c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
64d0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e  pSort ){.      n
64e0: 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72  PrefixReg = pSor
64f0: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
6500: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28  pr;.      if( !(
6510: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
6520: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
6530: 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78  orter) ) nPrefix
6540: 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Reg++;.      pPa
6550: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72  rse->nMem += nPr
6560: 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20  efixReg;.    }. 
6570: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
6580: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
6590: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
65a0: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
65b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44  ;.  }else if( pD
65c0: 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75  est->iSdst+nResu
65d0: 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e  ltCol > pParse->
65e0: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nMem ){.    /* T
65f0: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20  his is an error 
6600: 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63  condition that c
6610: 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65  an result, for e
6620: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53  xample, when a S
6630: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20  ELECT.    ** on 
6640: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
6650: 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  ide of an INSERT
6660: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72   contains more r
6670: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
6680: 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  an.    ** there 
6690: 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  are columns in t
66a0: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
66b0: 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72  left.  The error
66c0: 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a   will be caught.
66d0: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72      ** and repor
66e0: 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ted later.  But 
66f0: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  we need to make 
6700: 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  sure enough memo
6710: 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a  ry is allocated.
6720: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
6730: 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65  other spurious e
6740: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61  rrors in the mea
6750: 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50  ntime. */.    pP
6760: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
6770: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20  esultCol;.  }.  
6780: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e  pDest->nSdst = n
6790: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67  ResultCol;.  reg
67a0: 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74  Orig = regResult
67b0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
67c0: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
67d0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
67e0: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
67f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6800: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6810: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
6820: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
6830: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
6840: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
6850: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p->pEList->a[i].
6860: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
6870: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6880: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
6890: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
68a0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
68b0: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
68c0: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
68d0: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
68e0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
68f0: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
6900: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
6910: 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67  .    u8 ecelFlag
6920: 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  s;.    if( eDest
6930: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
6940: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6950: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6960: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6970: 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49  ecelFlags = SQLI
6980: 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20  TE_ECEL_DUP;.   
6990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63   }else{.      ec
69a0: 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  elFlags = 0;.   
69b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
69c0: 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d   && hasDistinct=
69d0: 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  =0 && eDest!=SRT
69e0: 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65  _EphemTab && eDe
69f0: 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  st!=SRT_Table ){
6a00: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61  .      /* For ea
6a10: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
6a20: 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61 74 20   p->pEList that 
6a30: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  is a copy of an 
6a40: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20  expression in.  
6a50: 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
6a60: 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72   BY clause (pSor
6a70: 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65  t->pOrderBy), se
6a80: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
6a90: 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65   .      ** iOrde
6aa0: 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20  rByCol value to 
6ab0: 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
6ac0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  e index of the O
6ad0: 52 44 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a  RDER BY .      *
6ae0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  * expression wit
6af0: 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79  hin the sort-key
6b00: 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f   that pushOntoSo
6b10: 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65  rter() will gene
6b20: 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rate..      ** T
6b30: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70  his allows the p
6b40: 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74  ->pEList field t
6b50: 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f  o be omitted fro
6b60: 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 63  m the sorted rec
6b70: 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61  ord,.      ** sa
6b80: 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43  ving space and C
6b90: 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20  PU cycles.  */. 
6ba0: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c       ecelFlags |
6bb0: 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  = (SQLITE_ECEL_O
6bc0: 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43  MITREF|SQLITE_EC
6bd0: 45 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20 20 66  EL_REF);.      f
6be0: 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53  or(i=pSort->nOBS
6bf0: 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72  at; i<pSort->pOr
6c00: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
6c10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
6c20: 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  j;.        if( (
6c30: 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  j = pSort->pOrde
6c40: 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  rBy->a[i].u.x.iO
6c50: 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
6c60: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
6c70: 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e  ist->a[j-1].u.x.
6c80: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b  iOrderByCol = i+
6c90: 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  1-pSort->nOBSat;
6ca0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6cb0: 20 7d 0a 20 20 20 20 20 20 72 65 67 4f 72 69 67   }.      regOrig
6cc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
6cd0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  rt( eDest==SRT_S
6ce0: 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  et || eDest==SRT
6cf0: 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20  _Mem .          
6d00: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
6d10: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
6d20: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
6d30: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73 75  .    }.    nResu
6d40: 6c 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 45  ltCol = sqlite3E
6d50: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
6d60: 70 50 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73 74  pParse,p->pEList
6d70: 2c 72 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20  ,regResult,.    
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6da0: 20 20 20 20 20 30 2c 65 63 65 6c 46 6c 61 67 73       0,ecelFlags
6db0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
6dc0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
6dd0: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
6de0: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
6df0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
6e00: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
6e10: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
6e20: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
6e30: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
6e40: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
6e50: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
6e60: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
6e70: 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69    switch( pDisti
6e80: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29  nct->eTnctType )
6e90: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
6ea0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
6eb0: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  RED: {.        V
6ec0: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
6ed0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e         /* No lon
6ee0: 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65  ger required Ope
6ef0: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
6f00: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
6f10: 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20   iJump;         
6f20: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
6f30: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  tination */.    
6f40: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b      int regPrev;
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
6f60: 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74  revious row cont
6f70: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ent */..        
6f80: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
6f90: 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  e for the previo
6fa0: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  us row */.      
6fb0: 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
6fc0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6fd0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
6fe0: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
6ff0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
7000: 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
7010: 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
7020: 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e  rlier to an OP_N
7030: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ull.        ** s
7040: 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  ets the MEM_Clea
7050: 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66  red bit on the f
7060: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66  irst register of
7070: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7080: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20  previous value. 
7090: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
70a0: 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77   the OP_Ne below
70b0: 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20   to always.     
70c0: 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68     ** fail on th
70d0: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
70e0: 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  n of the loop ev
70f0: 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  en if the first.
7100: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69          ** row i
7110: 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20  s all NULLs..   
7120: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7130: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7140: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
7150: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
7160: 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73  .        pOp = s
7170: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
7180: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7190: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
71a0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
71b0: 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_Null;.        
71c0: 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
71d0: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
71e0: 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20  egPrev;..       
71f0: 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
7200: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
7210: 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  v) + nResultCol;
7220: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
7230: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
7240: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7250: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
7260: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
7270: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
7280: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
7290: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
72a0: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
72b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
72c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
72d0: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
72e0: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
72f0: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
7300: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
7310: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
7320: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7340: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
7350: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
7360: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
7370: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
7380: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
7390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
73a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
73b0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
73c0: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
73d0: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
73e0: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
73f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7400: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
7410: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
7420: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
7430: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
7440: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
7450: 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  mp || pParse->db
7460: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7470: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7480: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7490: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
74a0: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
74b0: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
74c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
74d0: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
74e0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
74f0: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
7500: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7510: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
7520: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
7530: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7540: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
7550: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
7560: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
7570: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
7580: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
7590: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
75a0: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
75b0: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
75c0: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
75d0: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
75e0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
75f0: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
7600: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
7610: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7620: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  .    if( pSort==
7630: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
7640: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
7650: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
7660: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
7670: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
7680: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
7690: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
76a0: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
76b0: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
76c0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
76d0: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
76e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
76f0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7700: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
7710: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
7720: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
7730: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
7740: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
7750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7760: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7770: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7780: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7790: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
77a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
77b0: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
77c0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65  t, iParm, r1, re
77d0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
77e0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Col);.      sqli
77f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7800: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7810: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7820: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
7830: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
7840: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
7850: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
7860: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
7870: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
7880: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
7890: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
78a0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
78b0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
78c0: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
78d0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
78e0: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
78f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7900: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
7910: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
7920: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
7930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7940: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7950: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7960: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
7970: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
7980: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
7990: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
79a0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
79b0: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
79c0: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
79d0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
79e0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
79f0: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
7a00: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7a10: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
7a20: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
7a30: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
7a40: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7a50: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
7a60: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7a70: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
7a80: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7a90: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ( eDest==SRT_Fif
7aa0: 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  o );.      testc
7ab0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7ac0: 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20  DistFifo );.    
7ad0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7ae0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
7af0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
7b00: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
7b10: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
7b20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7b30: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
7b40: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
7b50: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
7b60: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
7b70: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
7b80: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
7b90: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
7ba0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
7bb0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
7bc0: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
7bd0: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
7be0: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
7bf0: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
7c00: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
7c10: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
7c20: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
7c30: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
7c40: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
7c50: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
7c60: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
7c70: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
7c80: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
7c90: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
7ca0: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
7cb0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
7cc0: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
7cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7ce0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
7cf0: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
7d00: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20  addr, r1, 0);.  
7d10: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
7d20: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
7d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
7d40: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
7d50: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
7d60: 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75  ,regResult,nResu
7d70: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
7d80: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
7d90: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
7da0: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
7db0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7dc0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7dd0: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7de0: 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67  1+nPrefixReg,reg
7df0: 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78  Result,1,nPrefix
7e00: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
7e10: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
7e20: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
7e30: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
7e40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7e50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
7e60: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
7e70: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
7e80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7e90: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
7ea0: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
7eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7ec0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7ed0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
7ee0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
7ef0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
7f00: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
7f10: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
7f20: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
7f30: 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78  rse, r1, nPrefix
7f40: 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72  Reg+1);.      br
7f50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
7f60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7f70: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
7f80: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
7f90: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
7fa0: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
7fb0: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
7fc0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
7fd0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
7fe0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
7ff0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
8000: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
8010: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
8020: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
8030: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
8040: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
8050: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
8060: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
8070: 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79  t first glance y
8080: 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77  ou would think w
8090: 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65  e could optimize
80a0: 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20   out the.       
80b0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20   ** ORDER BY in 
80c0: 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20  this case since 
80d0: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74  the order of ent
80e0: 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a  ries in the set.
80f0: 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20          ** does 
8100: 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74  not matter.  But
8110: 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
8120: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20  a LIMIT clause, 
8130: 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  in which.       
8140: 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64   ** case the ord
8150: 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a  er does matter *
8160: 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  /.        pushOn
8170: 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20  toSorter(.      
8180: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
8190: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
81a0: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
81b0: 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52  ultCol, nPrefixR
81c0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
81d0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
81e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
81f0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
8200: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
8210: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
8220: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d  est->zAffSdst)==
8230: 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20  nResultCol );.  
8240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8250: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
8260: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
8270: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
8280: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31   .            r1
8290: 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
82a0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
82b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
82c0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
82d0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
82e0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
82f0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8310: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
8320: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
8330: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, 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 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8360: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
8370: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
8390: 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
83a0: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
83b0: 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
83c0: 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
83d0: 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
83e0: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
83f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
8400: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8410: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50  P_Integer, 1, iP
8420: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
8430: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
8440: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
8450: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
8460: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
8470: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8480: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
8490: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
84a0: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
84b0: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
84c0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
84d0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
84e0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
84f0: 65 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f 66 20  ell or array of 
8500: 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  .    ** memory c
8510: 65 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b 20 6f  ells and break o
8520: 75 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ut of the scan l
8530: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
8540: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
8550: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8560: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8570: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70  t( nResultCol<=p
8580: 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20  Dest->nSdst );. 
8590: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
85a0: 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20 20  orter(.         
85b0: 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74     pParse, pSort
85c0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
85d0: 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74  regOrig, nResult
85e0: 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29  Col, nPrefixReg)
85f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8600: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
8610: 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74  ResultCol==pDest
8620: 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20  ->nSdst );.     
8630: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 65     assert( regRe
8640: 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20  sult==iParm );. 
8650: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
8660: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
8670: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
8680: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
8690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
86a0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
86b0: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
86c0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
86d0: 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52   */..    case SR
86e0: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20  T_Coroutine:    
86f0: 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20     /* Send data 
8700: 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  to a co-routine 
8710: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
8720: 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20  Output: {       
8730: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72   /* Return the r
8740: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
8750: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8760: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
8770: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8780: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
8790: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  put );.      if(
87a0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
87b0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
87c0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
87d0: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  p, regResult, re
87e0: 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f  gOrig, nResultCo
87f0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
8800: 20 20 20 20 20 20 20 20 20 20 6e 50 72 65 66 69            nPrefi
8810: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
8820: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
8830: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
8840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8850: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
8860: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
8870: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
8880: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8890: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
88a0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
88b0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
88c0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
88d0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
88e0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
88f0: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8900: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8910: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8920: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
8930: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
8940: 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  E.    /* Write t
8950: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  he results into 
8960: 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65  a priority queue
8970: 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61   that is order a
8980: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20  ccording to.    
8990: 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72  ** pDest->pOrder
89a0: 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44  By (in pSO).  pD
89b0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e  est->iSDParm (in
89c0: 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63   iParm) is the c
89d0: 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20  ursor for an.   
89e0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70   ** index with p
89f0: 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75  SO->nExpr+2 colu
8a00: 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65  mns.  Build a ke
8a10: 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20  y using pSO for 
8a20: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
8a30: 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75   pSO->nExpr colu
8a40: 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  mns, then make s
8a50: 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65  ure all keys are
8a60: 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e   unique by addin
8a70: 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  g a.    ** final
8a80: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c   OP_Sequence col
8a90: 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63  umn.  The last c
8aa0: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63  olumn is the rec
8ab0: 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ord as a blob.. 
8ac0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8ad0: 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20  RT_DistQueue:.  
8ae0: 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65    case SRT_Queue
8af0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  : {.      int nK
8b00: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  ey;.      int r1
8b10: 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20  , r2, r3;.      
8b20: 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30  int addrTest = 0
8b30: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
8b40: 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f   *pSO;.      pSO
8b50: 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72   = pDest->pOrder
8b60: 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  By;.      assert
8b70: 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e  ( pSO );.      n
8b80: 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72  Key = pSO->nExpr
8b90: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
8ba0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
8bb0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32  Parse);.      r2
8bc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8bd0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
8be0: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33  Key+2);.      r3
8bf0: 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20   = r2+nKey+1;.  
8c00: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
8c10: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
8c20: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8c30: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
8c40: 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e   DistQueue, then
8c50: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
8c60: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
8c70: 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64    ** on a second
8c80: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
8c90: 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20   that holds all 
8ca0: 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65  values every pre
8cb0: 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20  viously.        
8cc0: 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
8cd0: 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20  queue. */.      
8ce0: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
8cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
8d00: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
8d10: 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20  Parm+1, 0, .    
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d40: 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e      regResult, n
8d50: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
8d60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
8d70: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
8d80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8d90: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
8da0: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
8db0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
8dc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
8dd0: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
8de0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
8df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8e00: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
8e10: 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20  iParm+1, r3);.  
8e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8e30: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
8e40: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
8e50: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
8e60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
8e70: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
8e80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8e90: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a  p2(v, OP_SCopy,.
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
8ec0: 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e  ult + pSO->a[i].
8ed0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
8ee0: 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  - 1,.           
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
8f00: 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2+i);.      }.  
8f10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8f20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
8f30: 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b  ence, iParm, r2+
8f40: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  nKey);.      sql
8f50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8f60: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
8f70: 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29   r2, nKey+2, r1)
8f80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8f90: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
8fa0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8fb0: 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65  arm, r1, r2, nKe
8fc0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y+2);.      if( 
8fd0: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
8fe0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8ff0: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
9000: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
9010: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
9020: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
9030: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
9040: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
9050: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
9060: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9070: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9080: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
9090: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
90a0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
90b0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
90c0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
90d0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
90e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
90f0: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
9100: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
9110: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
9120: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
9130: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
9140: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
9150: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
9160: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
9170: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
9180: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
9190: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
91a0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
91b0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
91c0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
91d0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
91e0: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
91f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9200: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
9210: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
9220: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
9230: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
9240: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
9250: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
9260: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
9270: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
9280: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
9290: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
92a0: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
92b0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
92c0: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
92d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
92e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
92f0: 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
9300: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
9310: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
9320: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
9330: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
9340: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
9350: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
9360: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
9370: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
9380: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
9390: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
93a0: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
93b0: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
93c0: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  ){.  int nExtra 
93d0: 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  = (N+X)*(sizeof(
93e0: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73  CollSeq*)+1) - s
93f0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
9400: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
9410: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
9420: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
9430: 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72  KeyInfo) + nExtr
9440: 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
9450: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
9460: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
9470: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
9480: 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29  KeyField = (u16)
9490: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69  N;.    p->nAllFi
94a0: 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29  eld = (u16)(N+X)
94b0: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
94c0: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
94d0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
94e0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
94f0: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
9500: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
9510: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
9520: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
9530: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
9540: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
9550: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
9560: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
9570: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
9580: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
9590: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
95a0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
95b0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
95c0: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
95d0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70  qlite3DbFreeNN(p
95e0: 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
95f0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
9600: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
9610: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
9620: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
9630: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
9640: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
9650: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9660: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
9670: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
9680: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
9690: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
96a0: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
96b0: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
96c0: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
96d0: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
96e0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
96f0: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
9700: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
9710: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
9720: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
9730: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
9740: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
9750: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
9760: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9770: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
9780: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
9790: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
97a0: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
97b0: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
97c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
97d0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
97e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
97f0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
9800: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
9810: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
9820: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
9830: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
9840: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
9850: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
9860: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
9870: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
9880: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
9890: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
98a0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
98b0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
98c0: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
98d0: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
98e0: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
98f0: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
9900: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
9910: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
9920: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
9930: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
9940: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
9950: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
9960: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9970: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
9980: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
9990: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
99a0: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
99b0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
99c0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
99d0: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
99e0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
99f0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
9a00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
9a10: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
9a20: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
9a30: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
9a40: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
9a50: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
9a60: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
9a70: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
9a80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
9a90: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9aa0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
9ab0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
9ac0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
9ad0: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
9ae0: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
9af0: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
9b00: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
9b10: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
9b20: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
9b30: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
9b40: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
9b50: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
9b60: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b  to the end */.){
9b70: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
9b80: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
9b90: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9ba0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
9bb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9bc0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
9bd0: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
9be0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
9bf0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
9c00: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
9c10: 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78  Expr-iStart, nEx
9c20: 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49  tra+1);.  if( pI
9c30: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
9c40: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
9c50: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
9c60: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
9c70: 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70  =iStart, pItem=p
9c80: 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20  List->a+iStart; 
9c90: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
9ca0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  tem++){.      pI
9cb0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
9cc0: 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  art] = sqlite3Ex
9cd0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
9ce0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
9cf0: 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  );.      pInfo->
9d00: 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74  aSortOrder[i-iSt
9d10: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
9d20: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
9d30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
9d40: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  o;.}../*.** Name
9d50: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
9d60: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
9d70: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
9d80: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
9d90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
9da0: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
9db0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
9dc0: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
9dd0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
9de0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
9df0: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
9e00: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
9e10: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
9e20: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
9e30: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
9e40: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
9e50: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
9e60: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
9e70: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
9e80: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
9e90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
9ea0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
9eb0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
9ec0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
9ed0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
9ee0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
9ef0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
9f00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
9f10: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
9f20: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
9f30: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
9f40: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
9f50: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
9f60: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
9f70: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
9f80: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
9f90: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
9fa0: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
9fb0: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
9fc0: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
9fd0: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
9fe0: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
9ff0: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
a000: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
a010: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a020: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
a030: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
a040: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
a050: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69  ar *zUsage){.  i
a060: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
a070: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
a080: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a090: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
a0a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
a0b0: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
a0c0: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
a0d0: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
a0e0: 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
a0f0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a100: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
a110: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
a120: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
a130: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
a140: 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73  ** Assign expres
a150: 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65  sion b to lvalue
a160: 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f   a. A second, no
a170: 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20  -op, version of 
a180: 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73  this macro.** is
a190: 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53   provided when S
a1a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a1b0: 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  IN is defined. T
a1c0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
a1d0: 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65  ode.** in sqlite
a1e0: 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73  3Select() to ass
a1f0: 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74  ign values to st
a200: 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76  ructure member v
a210: 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a  ariables that.**
a220: 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53   only exist if S
a230: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a240: 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  IN is not define
a250: 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74  d without pollut
a260: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  ing the.** code 
a270: 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72  with #ifndef dir
a280: 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65  ectives..*/.# de
a290: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
a2a0: 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d  nteger(a, b) a =
a2b0: 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d   b..#else./* No-
a2c0: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
a2d0: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
a2e0: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
a2f0: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
a300: 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  e explainTempTab
a310: 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65  le(y,z).# define
a320: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
a330: 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  er(y,z).#endif..
a340: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a350: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a360: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
a370: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
a380: 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a  ND_SELECT)./*.**
a390: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
a3a0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
a3b0: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
a3c0: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
a3d0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
a3e0: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
a3f0: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
a400: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
a410: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
a420: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
a430: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
a440: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
a450: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  forms:.**.**   "
a460: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
a470: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
a480: 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20  Sub2 (op)".**   
a490: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
a4a0: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
a4b0: 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50  iSub2 USING TEMP
a4c0: 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a   B-TREE (op)".**
a4d0: 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20  .** where iSub1 
a4e0: 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68  and iSub2 are th
a4f0: 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65  e integers passe
a500: 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  d as the corresp
a510: 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  onding.** functi
a520: 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61  on parameters, a
a530: 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78  nd op is the tex
a540: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
a550: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
a560: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  r.** of the same
a570: 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d   name. The param
a580: 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62  eter "op" must b
a590: 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  e one of TK_UNIO
a5a0: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a  N, TK_EXCEPT,.**
a5b0: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72   TK_INTERSECT or
a5c0: 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72   TK_ALL. The fir
a5d0: 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20  st form is used 
a5e0: 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65  if argument bUse
a5f0: 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65  Tmp is .** false
a600: 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20  , or the second 
a610: 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72  form if it is tr
a620: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
a630: 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  id explainCompos
a640: 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ite(.  Parse *pP
a650: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
a660: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
a670: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
a680: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6a0: 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  One of TK_UNION,
a6b0: 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20   TK_EXCEPT etc. 
a6c0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20  */.  int iSub1, 
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
a6f0: 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69   id 1 */.  int i
a700: 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20  Sub2,           
a710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
a720: 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20  bquery id 2 */. 
a730: 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20   int bUseTmp    
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65   /* True if a te
a760: 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65  mp table was use
a770: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
a780: 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c  ( op==TK_UNION |
a790: 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  | op==TK_EXCEPT 
a7a0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
a7b0: 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c  ECT || op==TK_AL
a7c0: 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  L );.  if( pPars
a7d0: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
a7e0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
a7f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a800: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
a810: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20  qlite3MPrintf(. 
a820: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
a830: 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42  b, "COMPOUND SUB
a840: 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25  QUERIES %d AND %
a850: 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31  d %s(%s)", iSub1
a860: 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20  , iSub2,.       
a870: 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20   bUseTmp?"USING 
a880: 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22  TEMP B-TREE ":""
a890: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f  , selectOpName(o
a8a0: 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  p).    );.    sq
a8b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
a8c0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
a8d0: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
a8e0: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
a8f0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
a900: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
a910: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
a920: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
a930: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
a940: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
a950: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
a960: 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
a970: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
a980: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
a990: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
a9a0: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
a9b0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
a9c0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
a9d0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
a9e0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
a9f0: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
aa00: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
aa10: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
aa20: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
aa30: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
aa40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
aa50: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
aa60: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
aa70: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
aa80: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
aa90: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
aaa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
aab0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
aac0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
aad0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
aae0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
aaf0: 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ent */.  SortCtx
ab00: 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e   *pSort,   /* In
ab10: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
ab20: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ab30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
ab40: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
ab50: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
ab60: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
ab70: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
ab80: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
ab90: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
aba0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
abb0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
abe0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
abf0: 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d   int addrBreak =
ac00: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
ac10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
ac20: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78   Jump here to ex
ac30: 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  it loop */.  int
ac40: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
ac50: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ac60: 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d  abel(v);  /* Jum
ac70: 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20  p here for next 
ac80: 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  cycle */.  int a
ac90: 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f  ddr;.  int addrO
aca0: 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  nce = 0;.  int i
acb0: 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Tab;.  ExprList 
acc0: 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72  *pOrderBy = pSor
acd0: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  t->pOrderBy;.  i
ace0: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
acf0: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69  ->eDest;.  int i
ad00: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53  Parm = pDest->iS
ad10: 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67  DParm;.  int reg
ad20: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
ad30: 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  wid;.  int iCol;
ad40: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
ad50: 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20  nt iSortTab;    
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ad70: 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20  * Sorter cursor 
ad80: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
ad90: 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b    int nSortData;
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61    /* Trailing va
adc0: 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f  lues to read fro
add0: 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  m sorter */.  in
ade0: 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b  t i;.  int bSeq;
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
ae10: 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  f sorter record 
ae20: 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f  includes seq. no
ae30: 2e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  . */.  struct Ex
ae40: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75  prList_item *aOu
ae50: 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  tEx = p->pEList-
ae60: 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  >a;..  assert( a
ae70: 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20  ddrBreak<0 );.  
ae80: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
ae90: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
aea0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aeb0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
aec0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
aed0: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
aee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
aef0: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65  eGoto(v, addrBre
af00: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
af10: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
af20: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
af30: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54  BkOut);.  }.  iT
af40: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  ab = pSort->iECu
af50: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
af60: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
af70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
af80: 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d  utine || eDest==
af90: 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72  SRT_Mem ){.    r
afa0: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  egRowid = 0;.   
afb0: 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d   regRow = pDest-
afc0: 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72  >iSdst;.    nSor
afd0: 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  tData = nColumn;
afe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
aff0: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
b000: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
b010: 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  e);.    regRow =
b020: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
b030: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
b040: 6c 75 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74  lumn);.    nSort
b050: 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  Data = nColumn;.
b060: 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72    }.  nKey = pOr
b070: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70  derBy->nExpr - p
b080: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
b090: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
b0a0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
b0b0: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
b0c0: 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20   int regSortOut 
b0d0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
b0e0: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
b0f0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b100: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  .    if( pSort->
b110: 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20  labelBkOut ){.  
b120: 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
b130: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
b140: 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
b150: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b160: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b170: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b180: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
b190: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
b1a0: 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44  t, nKey+1+nSortD
b1b0: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64  ata);.    if( ad
b1c0: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
b1d0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b1e0: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
b1f0: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
b200: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b210: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
b220: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
b230: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b240: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
b250: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
b260: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
b270: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b280: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
b290: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
b2a0: 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72  regSortOut, iSor
b2b0: 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20  tTab);.    bSeq 
b2c0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
b2d0: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
b2e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b2f0: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
b300: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
b310: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b320: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
b330: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
b340: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69  Continue);.    i
b350: 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a  SortTab = iTab;.
b360: 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20      bSeq = 1;.  
b370: 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f  }.  for(i=0, iCo
b380: 6c 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69  l=nKey+bSeq-1; i
b390: 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29  <nSortData; i++)
b3a0: 7b 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78  {.    if( aOutEx
b3b0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
b3c0: 43 6f 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b 2b 3b  Col==0 ) iCol++;
b3d0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 53 6f  .  }.  for(i=nSo
b3e0: 72 74 44 61 74 61 2d 31 3b 20 69 3e 3d 30 3b 20  rtData-1; i>=0; 
b3f0: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 69 52  i--){.    int iR
b400: 65 61 64 3b 0a 20 20 20 20 69 66 28 20 61 4f 75  ead;.    if( aOu
b410: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
b420: 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  rByCol ){.      
b430: 69 52 65 61 64 20 3d 20 61 4f 75 74 45 78 5b 69  iRead = aOutEx[i
b440: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
b450: 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  l-1;.    }else{.
b460: 20 20 20 20 20 20 69 52 65 61 64 20 3d 20 69 43        iRead = iC
b470: 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol--;.    }.    
b480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b490: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
b4a0: 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64 2c  iSortTab, iRead,
b4b0: 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20   regRow+i);.    
b4c0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b4d0: 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  "%s", aOutEx[i].
b4e0: 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69  zName ? aOutEx[i
b4f0: 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78  ].zName : aOutEx
b500: 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d  [i].zSpan));.  }
b510: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
b520: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
b530: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
b540: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
b550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b560: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b570: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
b580: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
b590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b5a0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
b5b0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
b5c0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
b5d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
b5e0: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
b5f0: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
b600: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
b610: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b620: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
b630: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
b640: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
b650: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
b660: 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  30(pDest->zAffSd
b670: 73 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  st) );.      sql
b680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
b690: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b6a0: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
b6b0: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6d0: 20 20 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53      pDest->zAffS
b6e0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
b6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b700: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
b710: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
b720: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
b730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b740: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
b750: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
b760: 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 52 6f   regRowid, regRo
b770: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
b780: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b790: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
b7a0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
b7b0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
b7c0: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
b7d0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
b7e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b7f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
b800: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
b810: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
b820: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
b830: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
b840: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
b850: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
b860: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
b870: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
b880: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
b890: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
b8a0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
b8b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b8c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b8d0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
b8e0: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
b8f0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
b900: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
b910: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
b920: 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  e, pDest->iSdst,
b930: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
b940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b950: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b960: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
b970: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
b980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
b990: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
b9a0: 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b   if( regRowid ){
b9b0: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
b9c0: 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20 20  SRT_Set ){.     
b9d0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
b9e0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
b9f0: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
ba00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ba10: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ba20: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
ba30: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d  , regRow);.    }
ba40: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
ba50: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
ba60: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
ba70: 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  }.  /* The botto
ba80: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
ba90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
baa0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
bab0: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
bac0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
bad0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
bae0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
baf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bb00: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
bb10: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
bb20: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
bb30: 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
bb40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bb50: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
bb60: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
bb70: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
bb80: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65  .  if( pSort->re
bb90: 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65  gReturn ) sqlite
bba0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
bbb0: 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  P_Return, pSort-
bbc0: 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73  >regReturn);.  s
bbd0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
bbe0: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
bbf0: 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  eak);.}../*.** R
bc00: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
bc10: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
bc20: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
bc30: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
bc40: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
bc50: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
bc60: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
bc70: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
bc80: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
bc90: 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65  ** Also try to e
bca0: 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65  stimate the size
bcb0: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
bcc0: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
bcd0: 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  n that.** result
bce0: 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a   in *pEstWidth..
bcf0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
bd00: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
bd10: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
bd20: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
bd30: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
bd40: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
bd50: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
bd60: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
bd70: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
bd80: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
bd90: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
bda0: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
bdb0: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
bdc0: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
bdd0: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
bde0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
bdf0: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
be00: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
be10: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
be20: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
be30: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
be40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
be50: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
be60: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
be70: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
be80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
be90: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
bea0: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
beb0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
bec0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
bed0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
bee0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
bef0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
bf00: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
bf10: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
bf20: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
bf30: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
bf40: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
bf50: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
bf60: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
bf70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bf80: 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f  e has either 3 o
bf90: 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64  r 6 parameters d
bfa0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
bfb0: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
bfc0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
bfd0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
bfe0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
bff0: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  ion is used..*/.
c000: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c010: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c020: 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f  DATA.# define co
c030: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
c040: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
c050: 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65  pl(A,B,C,D,E).#e
c060: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
c070: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
c080: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c090: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
c0a0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
c0b0: 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,E) columnTypeIm
c0c0: 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73  pl(A,B).#endif.s
c0d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c0e0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
c0f0: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
c100: 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20 53  *pNC, .#ifndef S
c110: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c120: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 45  UMN_METADATA.  E
c130: 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73 65  xpr *pExpr.#else
c140: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
c150: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
c160: 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74  zOrigDb,.  const
c170: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61   char **pzOrigTa
c180: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
c190: 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64  **pzOrigCol.#end
c1a0: 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  if.){.  char con
c1b0: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
c1c0: 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20 53   int j;.#ifdef S
c1d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c1e0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63  UMN_METADATA.  c
c1f0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
c200: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  Db = 0;.  char c
c210: 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d  onst *zOrigTab =
c220: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
c230: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
c240: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
c250: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
c260: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
c270: 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  cList!=0 );.  as
c280: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
c290: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
c2a0: 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  ;  /* This routi
c2b0: 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65 20  ne runes before 
c2c0: 61 67 67 72 65 67 61 74 65 73 0a 20 20 20 20 20  aggregates.     
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2f0: 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73 73    ** are process
c300: 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  ed */.  switch( 
c310: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
c320: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
c330: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
c340: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
c350: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
c360: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
c370: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
c380: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
c390: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
c3a0: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
c3b0: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
c3c0: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
c3d0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
c3e0: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
c3f0: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
c400: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
c410: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
c420: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
c430: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
c440: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
c450: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
c460: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
c470: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
c480: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
c490: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
c4a0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
c4b0: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
c4c0: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
c4d0: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
c4e0: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
c4f0: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
c500: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
c510: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
c520: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
c530: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
c540: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
c550: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
c560: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
c570: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
c580: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
c590: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
c5a0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
c5b0: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
c5c0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
c5d0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
c5e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c5f0: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
c600: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c610: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
c620: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
c630: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65    /* At one time
c640: 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22  , code such as "
c650: 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69  SELECT new.x" wi
c660: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77  thin a trigger w
c670: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
c680: 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69  cause this condi
c690: 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69  tion to run.  Si
c6a0: 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76  nce then, we hav
c6b0: 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68  e restructured h
c6c0: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  ow.        ** tr
c6d0: 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65  igger code is ge
c6e0: 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74  nerated and so t
c6f0: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
c700: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
c710: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
c720: 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   However, it can
c730: 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66   still be true f
c740: 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  or statements li
c750: 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ke.        ** th
c760: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
c770: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
c780: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
c790: 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52  E t1(col INTEGER
c7a0: 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  );.        **   
c7b0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74  SELECT (SELECT t
c7c0: 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d  1.col) FROM FROM
c7d0: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a   t1;.        **.
c7e0: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
c7f0: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
c800: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
c810: 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c  pression "t1.col
c820: 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  " in the .      
c830: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e    ** sub-select.
c840: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
c850: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  et the column ty
c860: 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e  pe to NULL, even
c870: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75  .        ** thou
c880: 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61  gh it should rea
c890: 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22  lly be "INTEGER"
c8a0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
c8b0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
c8c0: 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61  not a problem, a
c8d0: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  s the column typ
c8e0: 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73  e of "t1.col" is
c8f0: 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a   never.        *
c900: 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c  * used. When col
c910: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
c920: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
c930: 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ssion .        *
c940: 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  * "(SELECT t1.co
c950: 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74  l)", the correct
c960: 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65   type is returne
c970: 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45  d (see the TK_SE
c980: 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20  LECT.        ** 
c990: 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a  branch below.  *
c9a0: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
c9b0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c9c0: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
c9d0: 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61  pExpr->pTab==pTa
c9e0: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
c9f0: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
ca00: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
ca10: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
ca20: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
ca30: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
ca40: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
ca50: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
ca60: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
ca70: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
ca80: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
ca90: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
caa0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
cab0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
cac0: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
cad0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
cae0: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
caf0: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
cb00: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
cb10: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
cb20: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
cb30: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
cb40: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
cb50: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
cb60: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
cb70: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
cb80: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
cb90: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
cba0: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
cbb0: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
cbc0: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
cbd0: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
cbe0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
cbf0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
cc00: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
cc10: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
cc20: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
cc30: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
cc40: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
cc50: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
cc60: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
cc70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
cc80: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
cc90: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
cca0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
ccb0: 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69  pe(&sNC, p,&zOri
ccc0: 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a  gDb,&zOrigTab,&z
ccd0: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
cce0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
ccf0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
cd00: 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61 20 43  eal table or a C
cd10: 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  TE table */.    
cd20: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
cd30: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
cd40: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
cd50: 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20 20  ETADATA.        
cd60: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
cd70: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
cd80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cd90: 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20   iCol==XN_ROWID 
cda0: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
cdb0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
cdc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
cdd0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
cde0: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
cdf0: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
ce00: 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69  zOrigCol = "rowi
ce10: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
ce20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e{.          zOr
ce30: 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  igCol = pTab->aC
ce40: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
ce50: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
ce60: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
ce70: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
ce80: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
ce90: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69    }.        zOri
cea0: 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  gTab = pTab->zNa
ceb0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
cec0: 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26 20 70  pNC->pParse && p
ced0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
cee0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
cef0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cf00: 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50  aToIndex(pNC->pP
cf10: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
cf20: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
cf30: 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e      zOrigDb = pN
cf40: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
cf50: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
cf60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
cf70: 65 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  e.        assert
cf80: 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
cf90: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
cfa0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
cfb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
cfc0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
cfd0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
cfe0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
cff0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d000: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
d010: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
d020: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
d030: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
d040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
d050: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
d060: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d070: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
d080: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
d090: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
d0a0: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
d0b0: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
d0c0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
d0d0: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
d0e0: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
d0f0: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
d100: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
d110: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
d120: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
d130: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
d140: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
d150: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
d160: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
d170: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
d180: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
d190: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
d1a0: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
d1b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
d1c0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
d1d0: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
d1e0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
d1f0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
d200: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
d210: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
d220: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
d230: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
d240: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d250: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
d260: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
d270: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
d280: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d290: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
d2a0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
d2b0: 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20  ETADATA  .  if( 
d2c0: 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20  pzOrigDb ){.    
d2d0: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61  assert( pzOrigTa
d2e0: 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29  b && pzOrigCol )
d2f0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20  ;.    *pzOrigDb 
d300: 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a  = zOrigDb;.    *
d310: 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69  pzOrigTab = zOri
d320: 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  gTab;.    *pzOri
d330: 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b  gCol = zOrigCol;
d340: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
d350: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
d360: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
d370: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
d380: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
d390: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
d3a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
d3b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d3c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d3d0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
d3e0: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
d3f0: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
d400: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
d410: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
d420: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
d430: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
d440: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
d450: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
d460: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
d470: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
d480: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d490: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
d4a0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d4b0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
d4c0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
d4d0: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
d4e0: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
d4f0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
d500: 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  rse;.  sNC.pNext
d510: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
d520: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
d530: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
d540: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
d550: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
d560: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
d570: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d580: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
d590: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
d5a0: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
d5b0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
d5c0: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
d5d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d5e0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
d5f0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d600: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
d610: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
d620: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a  ab, &zOrigCol);.
d630: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
d640: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
d650: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
d660: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
d670: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
d680: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
d690: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
d6a0: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
d6b0: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
d6c0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
d6d0: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
d6e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
d6f0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d700: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d710: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
d720: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
d730: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
d740: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d750: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41  v, i, COLNAME_TA
d760: 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53  BLE, zOrigTab, S
d770: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d780: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d790: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d7a0: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
d7b0: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49  , zOrigCol, SQLI
d7c0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  TE_TRANSIENT);.#
d7d0: 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d  else.    zType =
d7e0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
d7f0: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  , p, 0, 0, 0);.#
d800: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
d810: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d820: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
d830: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53  CLTYPE, zType, S
d840: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d850: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
d860: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d870: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a  OMIT_DECLTYPE) *
d880: 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  /.}.../*.** Comp
d890: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
d8a0: 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c 45 43  ames for a SELEC
d8b0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
d8c0: 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72  ** The only guar
d8d0: 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69 74  antee that SQLit
d8e0: 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f  e makes about co
d8f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68  lumn names is th
d900: 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  at if the.** col
d910: 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c  umn has an AS cl
d920: 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69  ause assigning i
d930: 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77  t a name, that w
d940: 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20  ill be the name 
d950: 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73  used..** That is
d960: 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65   the only docume
d970: 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20  nted guarantee. 
d980: 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c   However, countl
d990: 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ess applications
d9a0: 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76  .** developed ov
d9b0: 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61 76  er the years hav
d9c0: 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20  e made baseless 
d9d0: 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75  assumptions abou
d9e0: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a  t column names.*
d9f0: 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b  * and will break
da00: 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70   if those assump
da10: 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20  tions changes.  
da20: 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65  Hence, use extre
da30: 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68  me caution.** wh
da40: 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69  en modifying thi
da50: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f  s routine to avo
da60: 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61  id breaking lega
da70: 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c  cy..**.** See Al
da80: 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  so: sqlite3Colum
da90: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  nsFromExprList()
daa0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47 4d  .**.** The PRAGM
dab0: 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e  A short_column_n
dac0: 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d 41 20  ames and PRAGMA 
dad0: 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  full_column_name
dae0: 73 20 73 65 74 74 69 6e 67 73 20 61 72 65 0a 2a  s settings are.*
daf0: 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20 20 54  * deprecated.  T
db00: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
db10: 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c 20  ng is short=ON, 
db20: 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39 25  full=OFF.  99.9%
db30: 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c 69   of all.** appli
db40: 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6f  cations should o
db50: 70 65 72 61 74 65 20 74 68 69 73 20 77 61 79 2e  perate this way.
db60: 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
db70: 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70 70 6f  we need to suppo
db80: 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  rt the.** other 
db90: 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61 63 79  modes for legacy
dba0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74  :.**.**    short
dbb0: 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20  =OFF, full=OFF: 
dbc0: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65       Column name
dbd0: 20 69 73 20 74 68 65 20 74 65 78 74 20 6f 66 20   is the text of 
dbe0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
dbf0: 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20 20 20  as it.**        
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c 79        originally
dc20: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
dc30: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
dc40: 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20 20  .  In.**        
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72 64        other word
dc70: 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f 66 20  s, the zSpan of 
dc80: 74 68 65 20 72 65 73 75 6c 74 20 65 78 70 72 65  the result expre
dc90: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
dca0: 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f  short=ON, full=O
dcb0: 46 46 3a 20 20 20 20 20 20 20 28 54 68 69 73 20  FF:       (This 
dcc0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 73  is the default s
dcd0: 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74 68 65  etting).  If the
dce0: 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 20 20 20 72 65 66 65 72 73 20 64          refers d
dd10: 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62  irectly to a tab
dd20: 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20  le column, then 
dd30: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d      result colum
dd60: 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 74  n name is just t
dd70: 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  he table column.
dd80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20 4f  name: COLUMN.  O
ddb0: 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70  therwise use zSp
ddc0: 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75 6c  an..**.**    ful
ddd0: 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59 3a  l=ON, short=ANY:
dde0: 20 20 20 20 20 20 20 49 66 20 74 68 65 20 72 65         If the re
ddf0: 73 75 6c 74 20 72 65 66 65 72 73 20 64 69 72 65  sult refers dire
de00: 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20  ctly to a table 
de10: 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20 20  column,.**      
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 20 20 20 20 74 68 65 6e 20 74 68 65          then the
de40: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
de50: 61 6d 65 20 77 69 74 68 20 74 68 65 20 74 61 62  ame with the tab
de60: 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20  le name.**      
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 70 72 65 66 69 78 2c 20          prefix, 
de90: 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e  ex: TABLE.COLUMN
dea0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  .  Otherwise use
deb0: 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   zSpan..*/.stati
dec0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
ded0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
dee0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
def0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
df00: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
df10: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f 2a 20  *pSelect     /* 
df20: 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e 20  Generate column 
df30: 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 53  names for this S
df40: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
df50: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
df60: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
df70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c  .  int i;.  Tabl
df80: 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c 69  e *pTab;.  SrcLi
df90: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
dfa0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
dfb0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
dfc0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
dfd0: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20 20  int fullName;   
dfe0: 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e   /* TABLE.COLUMN
dff0: 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73 65   if no AS clause
e000: 20 61 6e 64 20 69 73 20 61 20 64 69 72 65 63 74   and is a direct
e010: 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20 20   table ref */.  
e020: 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20 20 20  int srcName;    
e030: 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54 41   /* COLUMN or TA
e040: 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f  BLE.COLUMN if no
e050: 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69   AS clause and i
e060: 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69 66  s direct */..#if
e070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e080: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
e090: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
e0a0: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
e0b0: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
e0c0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
e0d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e0e0: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
e0f0: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
e100: 74 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  t || db->mallocF
e110: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
e120: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
e130: 73 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64  s are determined
e140: 20 62 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   by the left-mos
e150: 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70  t term of a comp
e160: 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20  ound select */. 
e170: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
e180: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
e190: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
e1a0: 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  ior;.  SELECTTRA
e1b0: 43 45 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c  CE(1,pParse,pSel
e1c0: 65 63 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67  ect,("generating
e1d0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22   column names\n"
e1e0: 29 29 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  ));.  pTabList =
e1f0: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
e200: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
e210: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73  ct->pEList;.  as
e220: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
e230: 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
e240: 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  !=0 );.  pParse-
e250: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
e260: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28  ;.  fullName = (
e270: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
e280: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
e290: 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d  !=0;.  srcName =
e2a0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
e2b0: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
e2c0: 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61  es)!=0 || fullNa
e2d0: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  me;.  sqlite3Vdb
e2e0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
e2f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
e300: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
e310: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
e320: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
e330: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
e340: 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
e350: 70 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  p!=0 );.    asse
e360: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47  rt( p->op!=TK_AG
e370: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20  G_COLUMN );  /* 
e380: 41 67 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68  Agg processing h
e390: 61 73 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a  as not run yet *
e3a0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
e3b0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
e3c0: 7c 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20  | p->pTab!=0 ); 
e3d0: 2f 2a 20 43 6f 76 65 72 69 6e 67 20 69 64 78 20  /* Covering idx 
e3e0: 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f  not yet coded */
e3f0: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
e400: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
e410: 20 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c       /* An AS cl
e420: 61 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65  ause always take
e430: 73 20 66 69 72 73 74 20 70 72 69 6f 72 69 74 79  s first priority
e440: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
e450: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
e460: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
e470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e480: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
e490: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
e4a0: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
e4b0: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
e4c0: 69 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70  if( srcName && p
e4d0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
e4e0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
e4f0: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
e500: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
e510: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
e520: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 61 73  ->pTab;.      as
e530: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
e540: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
e550: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
e560: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
e570: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
e580: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
e590: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
e5a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
e5b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
e5c0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
e5d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e5e0: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
e5f0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
e600: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e610: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a  if( fullName ){.
e620: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e630: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
e640: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e650: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
e660: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
e670: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
e680: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
e690: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
e6a0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
e6b0: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e6c0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e6d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e6e0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
e6f0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
e700: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
e710: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
e720: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
e730: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e740: 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
e750: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
e760: 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
e770: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
e780: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
e790: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e7a0: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
e7b0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
e7c0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
e7d0: 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
e7e0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
e7f0: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
e800: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
e810: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
e820: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
e830: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
e840: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
e850: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
e860: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
e870: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
e880: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
e890: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
e8a0: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
e8b0: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
e8c0: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
e8d0: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
e8e0: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
e8f0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
e900: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
e910: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
e920: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
e930: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
e940: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
e950: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
e960: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
e970: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
e980: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
e990: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
e9a0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
e9b0: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
e9c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
e9d0: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
e9e0: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
e9f0: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
ea00: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
ea10: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a  ITE_NOMEM..**.**
ea20: 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e   The only guaran
ea30: 74 65 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  tee that SQLite 
ea40: 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75  makes about colu
ea50: 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74  mn names is that
ea60: 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   if the.** colum
ea70: 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75  n has an AS clau
ea80: 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  se assigning it 
ea90: 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c  a name, that wil
eaa0: 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73  l be the name us
eab0: 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74  ed..** That is t
eac0: 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
ead0: 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48  ed guarantee.  H
eae0: 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73  owever, countles
eaf0: 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a  s applications.*
eb00: 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72  * developed over
eb10: 20 74 68 65 20 79 65 61 72 73 20 68 61 76 65 20   the years have 
eb20: 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20 61 73  made baseless as
eb30: 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20  sumptions about 
eb40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20  column names.** 
eb50: 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69  and will break i
eb60: 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69  f those assumpti
eb70: 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65  ons changes.  He
eb80: 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65  nce, use extreme
eb90: 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e   caution.** when
eba0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20   modifying this 
ebb0: 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64  routine to avoid
ebc0: 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79   breaking legacy
ebd0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f  ..**.** See Also
ebe0: 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  : generateColumn
ebf0: 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73  Names().*/.int s
ec00: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
ec10: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
ec20: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ec30: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ec40: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
ec50: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
ec60: 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
ec70: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
ec80: 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
ec90: 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e  mes */.  i16 *pn
eca0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
ecb0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
ecc0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
ecd0: 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
ece0: 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
ecf0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
ed00: 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
ed10: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
ed20: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ed30: 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
ed40: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
ed50: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed70: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
ed80: 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20 20   */.  u32 cnt;  
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eda0: 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
edb0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
edc0: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
edd0: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
ede0: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
edf0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
ee00: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
ee10: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ee30: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
ee40: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
ee50: 20 73 65 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a   set */.  char *
ee60: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
ee70: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
ee80: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
ee90: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
eea0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
eeb0: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
eec0: 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20   */.  Hash ht;  
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
eef0: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
ef00: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73  */..  sqlite3Has
ef10: 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66  hInit(&ht);.  if
ef20: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
ef30: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
ef40: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
ef50: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ef60: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
ef70: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
ef80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
ef90: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ol==0 );.    if(
efa0: 20 6e 43 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43   nCol>32767 ) nC
efb0: 6f 6c 20 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65  ol = 32767;.  }e
efc0: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
efd0: 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
efe0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
eff0: 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29  Col==(i16)nCol )
f000: 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  ;.  *pnCol = nCo
f010: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
f020: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
f030: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
f040: 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  l && !db->malloc
f050: 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f  Failed; i++, pCo
f060: 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
f070: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
f080: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
f090: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  umn.    */.    i
f0a0: 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
f0b0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
f0c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
f0d0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
f0e0: 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
f0f0: 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
f100: 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
f110: 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ame */.    }else
f120: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
f130: 6f 6c 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  olExpr = sqlite3
f140: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
f150: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
f160: 70 72 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  pr);.      while
f170: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
f180: 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
f190: 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
f1a0: 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
f1b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f1c0: 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
f1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
f1e0: 72 74 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  rt( pColExpr->op
f1f0: 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
f200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
f210: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  lExpr->op==TK_CO
f220: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
f230: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
f240: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
f250: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
f260: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
f270: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
f280: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
f290: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
f2a0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61  >pTab;.        a
f2b0: 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
f2c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
f2d0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
f2e0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
f2f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e     zName = iCol>
f300: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
f310: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
f320: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
f330: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
f340: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
f350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
f360: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f370: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
f380: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
f390: 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70   zName = pColExp
f3a0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
f3b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f3c0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
f3d0: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
f3e0: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
f3f0: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
f400: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
f410: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
f420: 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  zSpan;.      }. 
f430: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61     }.    if( zNa
f440: 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  me ){.      zNam
f450: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
f460: 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
f470: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f480: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
f490: 4d 50 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c 75  MPrintf(db,"colu
f4a0: 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20  mn%d",i+1);.    
f4b0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
f4c0: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
f4d0: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
f4e0: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
f4f0: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
f500: 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65  * append an inte
f510: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
f520: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
f530: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
f540: 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20  /.    cnt = 0;. 
f550: 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20     while( zName 
f560: 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  && sqlite3HashFi
f570: 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d  nd(&ht, zName)!=
f580: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  0 ){.      nName
f590: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f5a0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  30(zName);.     
f5b0: 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a   if( nName>0 ){.
f5c0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e          for(j=nN
f5d0: 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71  ame-1; j>0 && sq
f5e0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
f5f0: 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20  me[j]); j--){}. 
f600: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
f610: 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65  [j]==':' ) nName
f620: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
f630: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
f640: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
f650: 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c  %.*z:%u", nName,
f660: 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
f670: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20        if( cnt>3 
f680: 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  ) sqlite3_random
f690: 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29  ness(sizeof(cnt)
f6a0: 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  , &cnt);.    }. 
f6b0: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
f6c0: 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69   zName;.    sqli
f6d0: 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
f6e0: 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70  iesFromName(0, p
f6f0: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  Col);.    if( zN
f700: 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
f710: 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e  shInsert(&ht, zN
f720: 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c  ame, pCol)==pCol
f730: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f740: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
f750: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
f760: 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74 29  e3HashClear(&ht)
f770: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
f780: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
f790: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
f7a0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
f7b0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
f7c0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
f7d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
f7e0: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
f7f0: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
f800: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
f810: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f820: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
f830: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f840: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
f850: 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
f860: 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
f870: 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
f880: 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
f890: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f8a0: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
f8b0: 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
f8c0: 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
f8d0: 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
f8e0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
f8f0: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
f900: 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
f910: 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
f920: 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
f930: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
f940: 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
f950: 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
f960: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
f970: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
f980: 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
f990: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
f9a0: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
f9b0: 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
f9c0: 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
f9d0: 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
f9e0: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
f9f0: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
fa00: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
fa10: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
fa20: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
fa30: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
fa40: 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  dd column type i
fa50: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
fa60: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  is table */.  Se
fa70: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
fa80: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
fa90: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
faa0: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
fab0: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
fac0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
fad0: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
fae0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
faf0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
fb00: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
fb10: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
fb20: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
fb30: 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
fb40: 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
fb50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
fb60: 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
fb70: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
fb80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
fb90: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  pTab->nCol==pSel
fba0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
fbb0: 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
fbc0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
fbd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fbe0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
fbf0: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
fc00: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
fc10: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
fc20: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
fc30: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
fc40: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
fc50: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
fc60: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
fc70: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
fc80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
fc90: 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d  pe;.    int n, m
fca0: 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  ;.    p = a[i].p
fcb0: 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20  Expr;.    zType 
fcc0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
fcd0: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
fce0: 20 20 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45      /* pCol->szE
fcf0: 73 74 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75  st = ... // Colu
fd00: 6d 6e 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20  mn size est for 
fd10: 53 45 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65  SELECT tables ne
fd20: 76 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  ver used */.    
fd30: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
fd40: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
fd50: 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28  nity(p);.    if(
fd60: 20 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   zType ){.      
fd70: 6d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  m = sqlite3Strle
fd80: 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
fd90: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
fda0: 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  len30(pCol->zNam
fdb0: 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  e);.      pCol->
fdc0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
fdd0: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
fde0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  b, pCol->zName, 
fdf0: 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  n+m+2);.      if
fe00: 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b  ( pCol->zName ){
fe10: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
fe20: 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31  &pCol->zName[n+1
fe30: 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a  ], zType, m+1);.
fe40: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
fe50: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
fe60: 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20  G_HASTYPE;.     
fe70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
fe80: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
fe90: 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  =0 ) pCol->affin
fea0: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
feb0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c  _BLOB;.    pColl
fec0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
fed0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
fee0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
fef0: 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d  && pCol->zColl==
ff00: 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
ff10: 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
ff20: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
ff30: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
ff40: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
ff50: 54 61 62 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41  TabRow = 1; /* A
ff60: 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ny non-zero valu
ff70: 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a  e works */.}../*
ff80: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
ff90: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
ffa0: 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
ffb0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
ffc0: 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
ffd0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
ffe0: 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
fff0: 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
10000 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
10010 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
10020 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
10030 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
10040 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
10050 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73  rse->db;.  int s
10060 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61  avedFlags;..  sa
10070 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  vedFlags = db->f
10080 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  lags;.  db->flag
10090 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c  s &= ~SQLITE_Ful
100a0 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d  lColNames;.  db-
100b0 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
100c0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a  _ShortColNames;.
100d0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
100e0 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c  rep(pParse, pSel
100f0 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
10100 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
10110 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
10120 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
10130 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
10140 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
10150 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65  db->flags = save
10160 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d  dFlags;.  pTab =
10170 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
10180 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
10190 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
101a0 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
101b0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
101c0 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73  * The sqlite3Res
101d0 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
101e0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20   is only used n 
101f0 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c  contexts where l
10200 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73  ookaside.  ** is
10210 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
10220 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
10230 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b  side.bDisable );
10240 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  .  pTab->nTabRef
10250 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
10260 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d  ame = 0;.  pTab-
10270 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
10280 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
10290 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
102a0 34 38 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69  48576) );.  sqli
102b0 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
102c0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
102d0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
102e0 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
102f0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  ab->aCol);.  sql
10300 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
10310 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
10320 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
10330 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
10340 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
10350 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
10360 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
10370 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
10380 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
10390 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
103a0 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
103b0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
103c0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
103d0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
103e0 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
103f0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
10400 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
10410 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
10420 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
10430 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
10440 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
10450 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
10460 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
10470 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
10480 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73      return pPars
10490 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20  e->pVdbe;.  }.  
104a0 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
104b0 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f  level==0.   && O
104c0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
104d0 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
104e0 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
104f0 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50  nst).  ){.    pP
10500 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
10510 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  tor = 1;.  }.  r
10520 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
10530 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b  eCreate(pParse);
10540 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
10550 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
10560 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
10570 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
10580 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
10590 4c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  Limit expression
105a0 73 2e 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  s.  pLimit->pLef
105b0 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52  t and pLimit->pR
105c0 69 67 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78  ight hold the ex
105d0 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
105e0 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
105f0 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
10600 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
10610 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
10620 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
10630 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
10640 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
10650 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
10660 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
10670 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
10680 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
10690 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
106a0 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
106b0 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
106c0 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
106d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
106e0 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
106f0 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
10700 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
10710 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
10720 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
10730 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
10740 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
10750 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
10760 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
10770 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
10780 62 79 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  by pLimit->pLeft
10790 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69   and pLimit->pRi
107a0 67 68 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20  ght.  iLimit.** 
107b0 61 6e 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75  and iOffset shou
107c0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
107d0 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
107e0 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
107f0 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
10800 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
10810 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
10820 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
10830 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
10840 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
10850 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
10860 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
10870 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
10880 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
10890 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
108a0 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
108b0 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
108c0 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
108d0 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
108e0 6c 79 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c  ly if pLimit->pL
108f0 65 66 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  eft!=0 do the li
10900 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
10910 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
10920 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
10930 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
10940 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
10950 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
10960 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
10970 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
10980 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
10990 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
109a0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
109b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
109c0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
109d0 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
109e0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
109f0 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
10a00 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
10a10 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
10a20 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
10a30 6e 3b 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  n;.  Expr *pLimi
10a40 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a  t = p->pLimit;..
10a50 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
10a60 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
10a70 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
10a80 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
10a90 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
10aa0 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
10ab0 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
10ac0 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
10ad0 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
10ae0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
10af0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
10b00 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
10b10 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
10b20 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
10b30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
10b40 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
10b50 65 29 3b 0a 20 20 69 66 28 20 70 4c 69 6d 69 74  e);.  if( pLimit
10b60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
10b70 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c  pLimit->op==TK_L
10b80 49 4d 49 54 20 29 3b 0a 20 20 20 20 61 73 73 65  IMIT );.    asse
10b90 72 74 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  rt( pLimit->pLef
10ba0 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69  t!=0 );.    p->i
10bb0 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
10bc0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
10bd0 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
10be0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10bf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
10c00 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
10c10 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
10c20 72 28 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  r(pLimit->pLeft,
10c30 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &n) ){.      sq
10c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10c50 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
10c60 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
10c70 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10c80 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
10c90 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ));.      if( n=
10ca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
10cb0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
10cc0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10cd0 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
10ce0 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
10cf0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
10d00 36 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  64)n) ){.       
10d10 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
10d20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
10d30 75 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20  u64)n);.        
10d40 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
10d50 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20  F_FixedLimit;.  
10d60 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
10d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10d80 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10d90 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c  Limit->pLeft, iL
10da0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
10db0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10dc0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
10dd0 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
10de0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10df0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10e00 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
10e10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10e30 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
10e40 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
10e50 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
10e60 20 20 20 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e      if( pLimit->
10e70 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
10e80 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
10e90 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
10ea0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
10eb0 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
10ec0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
10ed0 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
10ee0 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
10ef0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10f00 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10f10 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 69  Limit->pRight, i
10f20 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
10f30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10f40 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
10f50 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
10f60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10f70 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
10f80 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
10f90 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
10fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10fb0 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
10fc0 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
10fd0 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  t+1, iOffset);. 
10fe0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10ff0 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
11000 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ET"));.    }.  }
11010 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
11020 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
11030 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
11040 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
11050 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
11060 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
11070 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
11080 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
11090 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
110a0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
110b0 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
110c0 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
110d0 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
110e0 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
110f0 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
11100 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
11110 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
11120 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
11130 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
11140 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
11150 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
11160 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
11170 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
11190 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
111a0 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
111b0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
111c0 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
111d0 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
111e0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
111f0 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
11200 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
11210 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
11220 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
11230 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
11240 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
11250 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43  ol>=0 );.  /* iC
11260 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20  ol must be less 
11270 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  than p->pEList->
11280 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73  nExpr.  Otherwis
11290 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64  e an error would
112a0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
112b0 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61  thrown during na
112c0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e  me resolution an
112d0 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68  d we would not h
112e0 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20  ave gotten.  ** 
112f0 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66  this far */.  if
11300 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57  ( pRet==0 && ALW
11310 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69  AYS(iCol<p->pELi
11320 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
11330 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
11340 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
11350 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
11360 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
11370 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
11380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
11390 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
113a0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
113b0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
113c0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
113d0 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
113e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
113f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
11400 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
11410 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
11420 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
11430 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
11440 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
11450 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
11460 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
11470 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
11480 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
11490 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
114a0 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
114b0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
114c0 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
114d0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
114e0 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
114f0 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
11500 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
11510 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
11520 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
11530 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
11540 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
11550 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
11560 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
11570 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
11580 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
11590 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
115a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
115b0 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
115c0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
115d0 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
115e0 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
115f0 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
11600 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
11610 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
11620 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
11630 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
11640 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
11650 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
11660 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
11670 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
11680 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
11690 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
116a0 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
116b0 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
116c0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
116d0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
116e0 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
116f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11700 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
11710 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
11720 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
11730 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
11740 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
11750 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
11760 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
11770 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
11780 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
11790 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
117a0 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
117b0 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
117c0 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
117d0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
117e0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
117f0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
11800 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
11810 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
11820 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
11830 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
11840 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
11850 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
11860 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
11870 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
11880 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11890 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
118a0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
118b0 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
118c0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
118d0 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
118e0 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
118f0 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
11900 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
11910 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
11920 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
11930 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
11940 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
11970 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
11980 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
11990 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
119b0 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
119d0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
119e0 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
119f0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
11a00 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
11a10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11a20 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
11a30 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
11a40 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
11a50 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  >a[].fg.isRecurs
11a60 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20  ive flag..**.** 
11a70 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  The setup-query 
11a80 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e  runs once to gen
11a90 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c  erate an initial
11aa0 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61   set of rows tha
11ab0 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51  t go.** into a Q
11ac0 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77  ueue table.  Row
11ad0 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
11ae0 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74  from the Queue t
11af0 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f  able one by.** o
11b00 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78  ne.  Each row ex
11b10 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
11b20 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20  ue is output to 
11b30 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65  pDest.  Then the
11b40 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61   single.** extra
11b50 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e  cted row (now in
11b60 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61   the iCurrent ta
11b70 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65  ble) becomes the
11b80 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
11b90 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  ** recursive-tab
11ba0 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69  le for a recursi
11bb0 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54  ve-query run.  T
11bc0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
11bd0 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
11be0 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63  .** is added bac
11bf0 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  k into the Queue
11c00 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e   table.  Then an
11c10 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74  other row is ext
11c20 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
11c30 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65  e.** and the ite
11c40 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ration continues
11c50 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
11c60 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
11c70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
11c80 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65  mpound query ope
11c90 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74  rator is UNION t
11ca0 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65  hen no duplicate
11cb0 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a   rows are ever.*
11cc0 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
11cd0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
11ce0 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20    The iDistinct 
11cf0 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f  table keeps a co
11d00 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a  py of all rows.*
11d10 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72  * that have ever
11d20 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
11d30 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61  nto Queue and ca
11d40 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20  uses duplicates 
11d50 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64  to be.** discard
11d60 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72  ed.  If the oper
11d70 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c  ator is UNION AL
11d80 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74  L, then duplicat
11d90 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  es are allowed..
11da0 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ** .** If the qu
11db0 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52  ery has an ORDER
11dc0 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65   BY, then entrie
11dd0 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74  s in the Queue t
11de0 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e  able are kept in
11df0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64  .** ORDER BY ord
11e00 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  er and the first
11e10 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63   entry is extrac
11e20 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63  ted for each cyc
11e30 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20  le.  Without.** 
11e40 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
11e50 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
11e60 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a  just a FIFO..**.
11e70 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c  ** If a LIMIT cl
11e80 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64  ause is provided
11e90 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
11ea0 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72  tion stops after
11eb0 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68   LIMIT rows.** h
11ec0 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20  ave been output 
11ed0 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d  to pDest.  A LIM
11ee0 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73  IT of zero means
11ef0 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f   to output no ro
11f00 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61  ws and a.** nega
11f10 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73  tive LIMIT means
11f20 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72   to output all r
11f30 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ows.  If there i
11f40 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54  s also an OFFSET
11f50 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20   clause.** with 
11f60 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
11f70 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
11f80 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20   OFFSET outputs 
11f90 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61  are discarded ra
11fa0 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69  ther.** than bei
11fb0 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74  ng sent to pDest
11fc0 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75  .  The LIMIT cou
11fd0 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  nt does not begi
11fe0 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46  n until after OF
11ff0 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76  FSET.** rows hav
12000 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a  e been skipped..
12010 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
12020 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
12030 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72  siveQuery(.  Par
12040 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12050 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12060 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12070 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12080 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76   /* The recursiv
12090 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63  e SELECT to be c
120a0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
120b0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
120c0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
120d0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
120e0 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
120f0 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
12100 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
12110 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
12120 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
12130 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   */.  int nCol =
12140 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
12150 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  r;  /* Number of
12160 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
12170 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20  recursive table 
12180 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
12190 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
121a0 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
121b0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
121c0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
121d0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
121e0 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  tup = p->pPrior;
121f0 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20     /* The setup 
12200 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61  query */.  int a
12210 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
12220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
12230 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
12240 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61   int addrCont, a
12250 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f  ddrBreak;      /
12260 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42  * CONTINUE and B
12270 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a  REAK addresses *
12280 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  /.  int iCurrent
12290 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
122a0 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74    /* The Current
122b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
122c0 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20  regCurrent;     
122d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
122e0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75  ister holding Cu
122f0 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
12300 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20   int iQueue;    
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12320 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c  * The Queue tabl
12330 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74  e */.  int iDist
12340 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20  inct = 0;       
12350 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72       /* To ensur
12360 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73  e unique results
12370 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69   if UNION */.  i
12380 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46  nt eDest = SRT_F
12390 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ifo;         /* 
123a0 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20  How to write to 
123b0 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63  Queue */.  Selec
123c0 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b  tDest destQueue;
123d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
123e0 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e  ctDest targettin
123f0 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  g the Queue tabl
12400 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
12430 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
12440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12450 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
12460 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  t code */.  Expr
12470 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
12480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12490 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
124a0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
124b0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
124c0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d      /* Saved LIM
124d0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
124e0 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c  .  int regLimit,
124f0 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20   regOffset;     
12500 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73   /* Registers us
12510 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20  ed by LIMIT and 
12520 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20  OFFSET */..  /* 
12530 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61  Obtain authoriza
12540 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63  tion to do a rec
12550 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
12560 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
12570 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
12580 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c  QLITE_RECURSIVE,
12590 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
125a0 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73  rn;..  /* Proces
125b0 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  s the LIMIT and 
125c0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20  OFFSET clauses, 
125d0 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f  if they exist */
125e0 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  .  addrBreak = s
125f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
12600 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
12610 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20  lectRow = 320;  
12620 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77  /* 4 billion row
12630 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
12640 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
12650 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61  rse, p, addrBrea
12660 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70  k);.  pLimit = p
12670 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c  ->pLimit;.  regL
12680 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
12690 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20  ;.  regOffset = 
126a0 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
126b0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
126c0 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f  ->iLimit = p->iO
126d0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72  ffset = 0;.  pOr
126e0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
126f0 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  rBy;..  /* Locat
12700 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
12710 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65  ber of the Curre
12720 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  nt table */.  fo
12730 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c  r(i=0; ALWAYS(i<
12740 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b  pSrc->nSrc); i++
12750 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  ){.    if( pSrc-
12760 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72  >a[i].fg.isRecur
12770 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43  sive ){.      iC
12780 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61  urrent = pSrc->a
12790 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20  [i].iCursor;.   
127a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
127b0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
127c0 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65  te cursors numbe
127d0 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64  rs for Queue and
127e0 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20   Distinct.  The 
127f0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
12800 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69  r.  ** the Disti
12810 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62  nct table must b
12820 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72  e exactly one gr
12830 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65  eater than Queue
12840 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66   in order.  ** f
12850 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46  or the SRT_DistF
12860 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74  ifo and SRT_Dist
12870 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f  Queue destinatio
12880 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20  ns to work. */. 
12890 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65   iQueue = pParse
128a0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20  ->nTab++;.  if( 
128b0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
128c0 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  ){.    eDest = p
128d0 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69  OrderBy ? SRT_Di
128e0 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69  stQueue : SRT_Di
128f0 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73  stFifo;.    iDis
12900 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
12910 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  nTab++;.  }else{
12920 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
12930 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75  derBy ? SRT_Queu
12940 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20  e : SRT_Fifo;.  
12950 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
12960 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51  tDestInit(&destQ
12970 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75  ueue, eDest, iQu
12980 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  eue);..  /* Allo
12990 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72  cate cursors for
129a0 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c   Current, Queue,
129b0 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a   and Distinct. *
129c0 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d  /.  regCurrent =
129d0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
129e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
129f0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
12a00 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c  seudo, iCurrent,
12a10 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f   regCurrent, nCo
12a20 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  l);.  if( pOrder
12a30 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
12a40 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75  o *pKeyInfo = mu
12a50 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
12a60 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
12a70 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 1);.    sqlit
12a80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12a90 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
12aa0 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72  , iQueue, pOrder
12ab0 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a  By->nExpr+2, 0,.
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ad0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
12ae0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
12af0 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75  O);.    destQueu
12b00 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  e.pOrderBy = pOr
12b10 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  derBy;.  }else{.
12b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12b30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
12b40 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75  Ephemeral, iQueu
12b50 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  e, nCol);.  }.  
12b60 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
12b70 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b  "Queue table"));
12b80 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74  .  if( iDistinct
12b90 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f   ){.    p->addrO
12ba0 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c  penEphm[0] = sql
12bb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12bc0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12bd0 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30  al, iDistinct, 0
12be0 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  );.    p->selFla
12bf0 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
12c00 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f  emeral;.  }..  /
12c10 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44  * Detach the ORD
12c20 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f  ER BY clause fro
12c30 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  m the compound S
12c40 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ELECT */.  p->pO
12c50 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f  rderBy = 0;..  /
12c60 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
12c70 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70  lts of the setup
12c80 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e  -query in Queue.
12c90 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e   */.  pSetup->pN
12ca0 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  ext = 0;.  rc = 
12cb0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12cc0 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64  arse, pSetup, &d
12cd0 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65  estQueue);.  pSe
12ce0 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  tup->pNext = p;.
12cf0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
12d00 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
12d10 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69  _query;..  /* Fi
12d20 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  nd the next row 
12d30 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64  in the Queue and
12d40 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77   output that row
12d50 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20   */.  addrTop = 
12d60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12d70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
12d80 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61  iQueue, addrBrea
12d90 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
12da0 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73  (v);..  /* Trans
12db0 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77  fer the next row
12dc0 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74   in Queue over t
12dd0 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73  o Current */.  s
12de0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12df0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
12e00 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f  iCurrent); /* To
12e10 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61   reset column ca
12e20 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  che */.  if( pOr
12e30 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
12e40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12e50 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75  , OP_Column, iQu
12e60 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
12e70 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65  Expr+1, regCurre
12e80 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt);.  }else{.  
12e90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12ea0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74  Op2(v, OP_RowDat
12eb0 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75  a, iQueue, regCu
12ec0 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  rrent);.  }.  sq
12ed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12ee0 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51  v, OP_Delete, iQ
12ef0 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74  ueue);..  /* Out
12f00 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72  put the single r
12f10 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f  ow in Current */
12f20 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  .  addrCont = sq
12f30 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
12f40 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66  el(v);.  codeOff
12f50 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74  set(v, regOffset
12f60 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73  , addrCont);.  s
12f70 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
12f80 50 61 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65  Parse, p, iCurre
12f90 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20  nt,.      0, 0, 
12fa0 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c  pDest, addrCont,
12fb0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
12fc0 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20  f( regLimit ){. 
12fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12fe0 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a  dOp2(v, OP_DecrJ
12ff0 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69  umpZero, regLimi
13000 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
13010 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
13020 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
13030 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
13040 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  l(v, addrCont);.
13050 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68  .  /* Execute th
13060 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
13070 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69  CT taking the si
13080 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
13090 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ent as.  ** the 
130a0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65  value for the re
130b0 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53  cursive-table. S
130c0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
130d0 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20   in the Queue.. 
130e0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
130f0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
13100 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  gate ){.    sqli
13110 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13120 73 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61  se, "recursive a
13130 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
13140 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29   not supported")
13150 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
13160 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
13170 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
13180 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
13190 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65  Queue);.    asse
131a0 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
131b0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   );.    p->pPrio
131c0 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a  r = pSetup;.  }.
131d0 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69  .  /* Keep runni
131e0 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69  ng the loop unti
131f0 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65  l the Queue is e
13200 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mpty */.  sqlite
13210 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
13220 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  rTop);.  sqlite3
13230 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
13240 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
13250 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76  .end_of_recursiv
13260 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74  e_query:.  sqlit
13270 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
13280 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
13290 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e  pOrderBy);.  p->
132a0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
132b0 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  rBy;.  p->pLimit
132c0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74   = pLimit;.  ret
132d0 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
132e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
132f0 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
13300 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74  references */.st
13310 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
13320 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
13330 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13340 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
13350 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
13360 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
13370 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
13380 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
13390 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
133a0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
133b0 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
133c0 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
133d0 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f  results */.);../
133e0 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20  *.** Handle the 
133f0 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  special case of 
13400 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
13410 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
13420 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55  s from a.** VALU
13430 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68  ES clause.  By h
13440 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20  andling this as 
13450 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20  a special case, 
13460 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a  we avoid deep.**
13470 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20   recursion, and 
13480 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64  thus do not need
13490 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20   to enforce the 
134a0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
134b0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20  POUND_SELECT.** 
134c0 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  on a VALUES clau
134d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73  se..**.** Becaus
134e0 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a  e the Select obj
134f0 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  ect originates f
13500 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61  rom a VALUES cla
13510 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68  use:.**   (1) Th
13520 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20  ere is no LIMIT 
13530 6f 72 20 4f 46 46 53 45 54 20 6f 72 20 65 6c 73  or OFFSET or els
13540 65 20 74 68 65 72 65 20 69 73 20 61 20 4c 49 4d  e there is a LIM
13550 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 0a  IT of exactly 1.
13560 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72  **   (2) All ter
13570 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c  ms are UNION ALL
13580 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20  .**   (3) There 
13590 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
135a0 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lause.**.** The 
135b0 22 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c  "LIMIT of exactl
135c0 79 20 31 22 20 63 61 73 65 20 6f 66 20 63 6f 6e  y 1" case of con
135d0 64 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73  dition (1) comes
135e0 20 61 62 6f 75 74 20 77 68 65 6e 20 61 20 56 41   about when a VA
135f0 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f  LUES.** clause o
13600 63 63 75 72 73 20 77 69 74 68 69 6e 20 73 63 61  ccurs within sca
13610 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 28  lar expression (
13620 65 78 3a 20 22 53 45 4c 45 43 54 20 28 56 41 4c  ex: "SELECT (VAL
13630 55 45 53 28 31 29 2c 28 32 29 2c 28 33 29 29 22  UES(1),(2),(3))"
13640 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  )..** The sqlite
13650 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 20 77  3CodeSubselect w
13660 69 6c 6c 20 68 61 76 65 20 61 64 64 65 64 20 74  ill have added t
13670 68 65 20 4c 49 4d 49 54 20 31 20 63 6c 61 75 73  he LIMIT 1 claus
13680 65 20 69 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a  e in tht case..*
13690 2a 20 53 69 6e 63 65 20 74 68 65 20 6c 69 6d 69  * Since the limi
136a0 74 20 69 73 20 65 78 61 63 74 6c 79 20 31 2c 20  t is exactly 1, 
136b0 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
136c0 65 76 61 6c 75 74 65 73 20 74 68 65 20 6c 65 66  evalutes the lef
136d0 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a  t-most VALUES..*
136e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
136f0 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a  tiSelectValues(.
13700 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13710 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
13720 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13730 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
13740 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
13750 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
13760 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
13770 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
13780 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
13790 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
137a0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
137b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
137c0 72 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 69  r;.  Select *pRi
137d0 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 69  ghtmost = p;.  i
137e0 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
137f0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  nt rc = 0;.  ass
13800 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
13810 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
13820 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73   );.  do{.    as
13830 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
13840 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b  s & SF_Values );
13850 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
13860 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70  op==TK_ALL || (p
13870 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
13880 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29  && p->pPrior==0)
13890 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
138a0 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  p->pNext==0 || p
138b0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
138c0 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73  =p->pNext->pELis
138d0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
138e0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  if( p->pPrior==0
138f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
13900 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d  sert( p->pPrior-
13910 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20  >pNext==p );.   
13920 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
13930 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77      nRow++;.  }w
13940 68 69 6c 65 28 31 29 3b 0a 20 20 77 68 69 6c 65  hile(1);.  while
13950 28 20 70 20 29 7b 0a 20 20 20 20 70 50 72 69 6f  ( p ){.    pPrio
13960 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
13970 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
13980 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13990 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
139a0 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
139b0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
139c0 6f 72 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  or;.    if( rc |
139d0 7c 20 70 52 69 67 68 74 6d 6f 73 74 2d 3e 70 4c  | pRightmost->pL
139e0 69 6d 69 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  imit ) break;.  
139f0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13a00 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
13a10 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
13a20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13a30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13a40 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
13a50 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
13a60 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
13a70 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
13a80 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
13a90 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
13aa0 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
13ab0 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
13ac0 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
13ad0 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
13ae0 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
13af0 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
13b00 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
13b10 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
13b20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
13b30 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
13b40 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
13b50 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
13b60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
13b70 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
13b80 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
13b90 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
13ba0 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
13bb0 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
13bc0 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
13bd0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
13be0 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
13bf0 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
13c00 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
13c10 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
13c20 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
13c30 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
13c40 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
13c50 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
13c60 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
13c70 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
13c80 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
13c90 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
13ca0 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
13cb0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
13cc0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
13cd0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
13ce0 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
13cf0 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
13d00 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
13d20 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
13d30 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
13d40 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
13d50 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
13d60 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
13d70 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
13d80 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
13d90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
13da0 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
13db0 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
13dc0 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
13dd0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
13de0 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
13df0 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
13e00 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
13e10 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
13e20 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
13e30 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
13e40 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
13e50 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
13e60 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
13e70 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
13e80 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
13e90 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
13ea0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
13eb0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
13ec0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13ed0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
13ee0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
13ef0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
13f00 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
13f10 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
13f20 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
13f30 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
13f40 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
13f50 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
13f60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13f70 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
13f80 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
13f90 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
13fa0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
13fb0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
13fc0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
13fd0 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
13fe0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
13ff0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
14000 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
14010 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
14020 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
14030 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
14040 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
14050 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
14060 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
14070 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
14080 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
14090 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
140a0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
140b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
140c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
140d0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
140e0 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20  nt iSub1 = 0;   
140f0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
14100 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
14110 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
14120 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
14130 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
14140 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
14150 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
14160 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
14170 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
14180 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
14190 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
141a0 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
141b0 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
141c0 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
141d0 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
141e0 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
141f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
14200 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
14210 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
14220 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
14230 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
14240 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
14250 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
14260 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
14270 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
14280 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
14290 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
142a0 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
142b0 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20  >pPrior;.  dest 
142c0 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
142d0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
142e0 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d   || pPrior->pLim
142f0 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
14300 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14310 2c 22 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75  ,"%s clause shou
14320 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
14330 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
14340 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64      pPrior->pOrd
14350 65 72 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52  erBy!=0 ? "ORDER
14360 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20   BY" : "LIMIT", 
14370 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
14380 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
14390 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
143a0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
143b0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
143c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
143d0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
143e0 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
143f0 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
14400 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
14410 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
14420 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
14430 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
14440 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
14450 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
14460 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
14470 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
14480 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
14490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
144a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
144b0 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
144c0 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
144d0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
144e0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
144f0 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
14500 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  * Special handli
14510 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ng for a compoun
14520 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
14530 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41  iginates as a VA
14540 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a  LUES clause..  *
14550 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
14560 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
14570 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lue ){.    rc = 
14580 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
14590 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  s(pParse, p, &de
145a0 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  st);.    goto mu
145b0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
145c0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
145d0 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
145e0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
145f0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
14600 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
14610 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
14620 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
14630 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
14640 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
14650 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73  >pEList );.  ass
14660 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
14670 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70  nExpr==pPrior->p
14680 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
14690 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
146a0 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70  OMIT_CTE.  if( p
146b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
146c0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
146d0 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
146e0 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72  ursiveQuery(pPar
146f0 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
14700 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
14710 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
14720 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
14730 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
14740 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
14750 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
14760 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
14770 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
14780 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
14790 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
147a0 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  st);.  }else..  
147b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
147c0 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
147d0 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
147e0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
147f0 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
14800 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
14810 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
14820 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
14830 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
14840 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
14850 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
14860 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69     pPrior->iLimi
14870 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
14880 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66       pPrior->iOf
14890 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
148a0 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
148b0 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
148c0 6d 69 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  mit;.      expla
148d0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
148e0 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
148f0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14910 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
14920 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
14930 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
14940 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
14950 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
14960 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
14970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14980 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
14990 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
149a0 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
149b0 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
149c0 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
149d0 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
149e0 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
149f0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
14a00 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14a10 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d  P_IfNot, p->iLim
14a20 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
14a30 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
14a40 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
14a50 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
14a60 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
14a70 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f         if( p->iO
14a80 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  ffset ){.       
14a90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14aa0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65  dOp3(v, OP_Offse
14ab0 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  tLimit,.        
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70      p->iLimit, p
14ae0 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e  ->iOffset+1, p->
14af0 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
14b00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14b10 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14b20 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
14b30 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14b40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14b50 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14b60 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
14b70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14b80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
14b90 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
14ba0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
14bb0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
14bc0 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ior;.      p->nS
14bd0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
14be0 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
14bf0 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
14c00 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
14c10 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
14c20 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  ->pLimit.       
14c30 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
14c40 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e  Integer(pPrior->
14c50 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26  pLimit->pLeft, &
14c60 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
14c70 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
14c80 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
14c90 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
14ca0 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
14cb0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
14cc0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
14cd0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
14ce0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
14cf0 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
14d00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14d10 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14d20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
14d30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14d40 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
14d50 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
14d60 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
14d70 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
14d80 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
14d90 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
14da0 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
14db0 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
14dc0 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
14dd0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
14de0 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
14df0 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
14e00 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
14e10 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
14e20 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
14e30 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
14e40 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
14e50 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
14e60 74 3b 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76  t;    /* Saved v
14e70 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
14e80 69 74 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  it  */.      int
14e90 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
14ea0 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
14eb0 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
14ec0 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
14ed0 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
14ee0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
14ef0 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
14f00 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
14f10 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
14f20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
14f30 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rOp ){.        /
14f40 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
14f50 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14f60 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
14f70 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
14f80 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
14f90 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14fa0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
14fb0 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
14fc0 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
14fd0 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
14fe0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
14ff0 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
15000 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  SDParm;.      }e
15010 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
15020 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
15030 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
15040 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
15050 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
15060 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
15070 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
15080 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
15090 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
150a0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
150b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
150c0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
150d0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
150e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
150f0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15100 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
15110 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15120 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15130 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
15140 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
15150 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
15160 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
15170 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
15180 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
15190 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
151a0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
151b0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
151c0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
151d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
151e0 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
151f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
15200 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
15210 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
15220 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
15230 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
15240 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
15250 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
15260 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
15270 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
15280 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
15290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
152a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
152b0 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
152c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
152d0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
152e0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
152f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15300 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
15310 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
15320 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
15330 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
15340 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
15350 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
15360 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
15370 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
15380 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
15390 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
153a0 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
153b0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
153c0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
153d0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
153e0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
153f0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  mit = 0;.      u
15400 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
15410 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61   op;.      expla
15420 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
15430 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
15440 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
15450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
15460 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
15470 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
15480 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
15490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
154a0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
154b0 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
154c0 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
154d0 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
154e0 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
154f0 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
15500 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
15510 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
15520 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
15530 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
15540 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
15550 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
15560 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
15570 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
15580 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
15590 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
155a0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
155b0 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
155c0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  _UNION ){.      
155d0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
155e0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
155f0 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
15600 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
15610 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tRow);.      }. 
15620 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15630 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
15640 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
15650 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
15660 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
15670 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
15680 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20  Offset = 0;..   
15690 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
156a0 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
156b0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
156c0 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
156d0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
156e0 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
156f0 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
15700 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
15710 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53  nionTab==dest.iS
15720 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  DParm || dest.eD
15730 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
15740 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
15750 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
15760 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
15770 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
15780 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
15790 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
157a0 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
157b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
157c0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
157d0 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
157e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
157f0 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
15800 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
15810 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
15820 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
15830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15840 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
15850 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
15860 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15870 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
15880 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15890 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
158a0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
158b0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
158c0 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20   unionTab,.     
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
158f0 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
15900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15910 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15920 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
15930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15940 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
15950 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
15960 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
15970 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
15980 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15990 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
159a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
159b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
159c0 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
159d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
159e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
159f0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
15a00 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
15a10 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20  INTERSECT ); {. 
15a20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
15a30 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
15a40 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
15a50 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
15a60 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20   *pLimit;.      
15a70 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
15a80 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
15a90 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20  sectdest;.      
15aa0 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f  int r1;..      /
15ab0 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
15ac0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
15ad0 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
15ae0 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
15af0 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
15b00 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
15b10 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
15b20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
15b30 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
15b40 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
15b50 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
15b60 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
15b70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
15b80 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
15b90 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15ba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15bb0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
15bc0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
15bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15be0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
15bf0 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ral, tab1, 0);. 
15c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15c10 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
15c20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
15c30 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
15c40 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
15c50 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
15c60 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
15c70 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
15c80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15c90 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
15ca0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
15cb0 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
15cc0 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
15cd0 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
15ce0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
15cf0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
15d00 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
15d10 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
15d20 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  ab1);.      expl
15d30 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
15d40 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
15d50 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
15d60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
15d70 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
15d80 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
15d90 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
15da0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
15db0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
15dc0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
15dd0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
15de0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
15df0 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
15e00 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
15e10 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
15e20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15e30 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
15e40 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30  hemeral, tab2, 0
15e50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15e60 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
15e70 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
15e80 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
15e90 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
15ea0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
15eb0 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
15ec0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
15ed0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
15ee0 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
15ef0 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
15f00 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c  tab2;.      expl
15f10 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
15f20 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
15f30 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
15f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
15f50 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
15f60 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
15f70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15f90 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
15fa0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
15fb0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
15fc0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
15fd0 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
15fe0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
15ff0 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
16000 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
16010 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
16020 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
16030 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
16040 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
16050 20 3d 20 70 4c 69 6d 69 74 3b 0a 0a 20 20 20 20   = pLimit;..    
16060 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16070 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
16080 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
16090 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
160a0 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
160b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
160c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
160d0 73 74 20 29 3b 0a 20 20 20 20 20 20 69 42 72 65  st );.      iBre
160e0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
160f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
16100 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
16110 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16120 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
16130 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
16140 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
16150 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
16160 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16170 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
16180 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
16190 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
161a0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
161b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
161c0 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
161d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
161e0 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
161f0 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
16200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16210 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
16220 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
16230 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65  nt, r1, 0); Vdbe
16240 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16250 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16260 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16270 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65   r1);.      sele
16280 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
16290 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20  se, p, tab1,.   
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162b0 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
162c0 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
162d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
162e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
162f0 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
16300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16310 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
16320 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  1, iStart); Vdbe
16330 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
16350 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
16360 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
16370 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16380 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
16390 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
163a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
163b0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
163c0 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
163d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
163e0 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
163f0 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
16400 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
16410 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
16420 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
16430 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
16440 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
16450 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
16460 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
16470 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
16480 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
16490 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
164a0 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
164b0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
164c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
164d0 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
164e0 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
164f0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
16500 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
16510 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
16520 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
16530 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
16540 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
16550 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
16560 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
16570 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
16580 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
16590 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
165a0 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
165b0 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
165c0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
165d0 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
165e0 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
165f0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
16600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
16610 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
16620 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
16630 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
16640 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
16650 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
16660 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
16670 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16690 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
166a0 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
166b0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
166c0 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
166d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
166e0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
166f0 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
16700 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
16710 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
16720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16730 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
16740 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
16750 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
16760 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
16770 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
16780 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
16790 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
167a0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
167b0 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
167c0 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
167d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
167e0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
167f0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
16800 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
16810 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
16820 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
16830 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
16840 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
16850 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
16860 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
16870 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
16880 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
16890 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
168a0 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
168b0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
168c0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
168d0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
168e0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
168f0 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
16900 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
16910 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
16920 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
16930 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
16940 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
16950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
16960 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
16970 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
16980 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
16990 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
169a0 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
169b0 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
169c0 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
169d0 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
169e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
169f0 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
16a00 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
16a10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16a20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16a30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16a40 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
16a50 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
16a60 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
16a70 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
16a80 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
16a90 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ab0 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
16ac0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
16ad0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
16ae0 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
16af0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
16b00 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
16b10 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
16b20 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
16b30 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
16b40 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
16b50 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
16b60 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
16b70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
16b80 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
16b90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16ba0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16bb0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
16bc0 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
16bd0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
16be0 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d  or when two or m
16bf0 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63  ore terms of a c
16c00 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68  ompound select h
16c10 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
16c20 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74   size result set
16c30 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
16c40 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d  e3SelectWrongNum
16c50 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65  TermsError(Parse
16c60 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
16c70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
16c80 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
16c90 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ues ){.    sqlit
16ca0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16cb0 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
16cc0 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
16cd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
16ce0 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s");.  }else{.  
16cf0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16d00 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
16d10 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
16d20 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
16d30 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
16d40 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
16d50 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
16d60 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
16d70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
16d80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
16d90 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
16da0 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
16db0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
16dc0 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
16dd0 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
16de0 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
16df0 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
16e00 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
16e10 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
16e20 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
16e30 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
16e40 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
16e50 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
16e60 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
16e70 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
16e80 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
16e90 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
16ea0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
16eb0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
16ec0 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
16ed0 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
16ee0 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
16ef0 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
16f00 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
16f10 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
16f20 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
16f30 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
16f40 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
16f50 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
16f60 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
16f70 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
16f80 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
16f90 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
16fa0 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
16fb0 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
16fc0 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
16fd0 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
16fe0 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
16ff0 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
17000 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
17010 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
17020 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
17030 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
17040 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
17050 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
17060 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
17070 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17080 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
17090 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
170a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
170b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
170c0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
170d0 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
170e0 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
170f0 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
17100 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
17110 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
17120 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
17130 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
17140 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
17150 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
17160 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
17170 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
17180 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
17190 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
171a0 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
171b0 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
171c0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
171d0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
171e0 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
171f0 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
17200 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
17210 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
17220 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
17230 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
17240 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
17250 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
17260 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
17270 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
17280 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17290 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
172a0 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
172b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
172c0 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
172d0 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
172e0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
172f0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
17300 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
17310 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  v ){.    int add
17320 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61  r1, addr2;.    a
17330 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
17340 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
17350 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20  fNot, regPrev); 
17360 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17370 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
17380 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17390 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
173a0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
173b0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
173c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
173e0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
173f0 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
17400 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
17410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17420 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
17430 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74  , addr2+2, iCont
17440 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20  inue, addr2+2); 
17450 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17460 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17470 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
17480 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
17490 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
174a0 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
174b0 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
174c0 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
174d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
174e0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
174f0 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
17500 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
17510 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17520 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
17530 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
17540 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
17550 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
17560 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
17570 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
17580 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
17590 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  t, iContinue);..
175a0 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
175b0 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73  >eDest!=SRT_Exis
175c0 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ts );.  assert( 
175d0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
175e0 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69  T_Table );.  swi
175f0 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
17600 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
17610 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
17620 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
17630 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
17640 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
17650 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
17660 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
17670 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17680 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
17690 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
176a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
176b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
176c0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
176d0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
176e0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
176f0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
17700 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17710 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
17720 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
17730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17740 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
17750 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
17760 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
17770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17780 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
17790 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
177a0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
177b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
177c0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
177d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
177e0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
177f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17800 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
17810 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
17820 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
17830 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
17840 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
17850 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20  (SELECT ...)".. 
17860 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
17870 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
17880 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65  int r1;.      te
17890 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
178a0 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31  st>1 );.      r1
178b0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
178c0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
178d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
178e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
178f0 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
17900 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
17910 0a 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70  .          r1, p
17920 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
17930 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
17940 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17950 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
17960 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17970 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17980 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17990 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
179a0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
179b0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
179c0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
179e0 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
179f0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
17a00 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17a10 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
17a20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17a30 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
17a40 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
17a50 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
17a60 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
17a70 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
17a80 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
17a90 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
17aa0 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
17ab0 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
17ac0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
17ad0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
17ae0 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
17af0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
17b00 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
17b10 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
17b20 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  0 );  testcase( 
17b30 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b  pIn->nSdst!=1 );
17b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17b50 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
17b60 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
17b70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
17b80 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
17b90 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
17ba0 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
17bb0 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
17bc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17bd0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
17be0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17bf0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
17c00 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
17c10 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
17c20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
17c30 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
17c40 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
17c50 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
17c60 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
17c70 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
17c80 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
17c90 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
17ca0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
17cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
17cc0 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
17cd0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
17ce0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
17cf0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
17d00 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
17d10 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
17d20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17d30 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
17d40 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
17d50 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  st->iSdst, pIn->
17d60 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
17d70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17d80 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
17d90 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
17da0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17db0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
17dc0 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
17dd0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
17de0 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
17df0 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
17e00 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
17e10 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
17e20 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
17e30 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
17e40 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
17e50 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
17e60 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
17e70 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
17e80 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
17e90 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
17ea0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
17eb0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
17ec0 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
17ed0 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
17ee0 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
17ef0 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
17f00 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
17f10 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
17f20 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
17f30 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
17f40 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
17f50 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
17f60 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
17f70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17f80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17f90 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
17fa0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17fb0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
17fc0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
17fd0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
17fe0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
17ff0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
18000 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18010 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
18020 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
18030 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
18040 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
18050 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
18060 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
18070 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18080 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
18090 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
180a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
180b0 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
180c0 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
180d0 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
180e0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
180f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
18100 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
18110 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18120 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
18130 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
18140 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
18150 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
18160 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
18170 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
18180 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
18190 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
181a0 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
181b0 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
181c0 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
181d0 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
181e0 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
181f0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
18200 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
18210 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
18220 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
18230 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
18240 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
18250 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
18260 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
18270 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
18280 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
18290 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
182a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
182b0 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
182c0 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
182d0 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
182e0 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
182f0 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
18300 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
18310 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
18320 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
18330 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
18340 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
18350 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
18360 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
18370 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
18380 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
18390 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
183a0 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
183b0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
183c0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
183d0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
183e0 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
183f0 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
18400 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
18410 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
18420 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
18430 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
18440 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
18450 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
18460 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
18470 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
18480 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
18490 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
184a0 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
184b0 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
184c0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
184d0 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
184e0 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
184f0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
18500 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
18510 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
18520 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
18530 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
18540 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
18550 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
18560 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
18570 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
18580 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
18590 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
185a0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
185b0 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
185c0 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
185d0 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
185e0 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
185f0 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
18600 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
18610 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
18620 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
18630 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
18640 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
18650 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
18660 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
18670 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
18680 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
18690 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
186a0 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
186b0 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
186c0 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
186d0 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
186e0 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
186f0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
18700 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
18710 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
18720 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
18730 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
18740 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
18750 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
18760 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
18770 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
18780 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
18790 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
187a0 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
187b0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
187c0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
187d0 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
187e0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
187f0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
18800 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
18810 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
18820 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
18830 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
18840 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
18850 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
18860 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
18870 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
18880 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
18890 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
188a0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
188b0 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
188c0 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
188d0 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
188e0 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
188f0 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
18900 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
18910 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
18920 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
18930 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
18940 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
18950 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
18960 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
18970 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
18980 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
18990 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
189a0 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
189b0 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
189c0 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
189d0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
189e0 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
189f0 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
18a00 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
18a10 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
18a20 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
18a30 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
18a40 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
18a50 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
18a60 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
18a70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
18a80 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
18a90 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
18aa0 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
18ab0 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
18ac0 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
18ad0 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
18ae0 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
18af0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
18b00 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
18b10 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
18b20 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
18b30 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
18b40 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
18b50 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
18b60 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
18b70 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
18b80 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
18b90 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
18ba0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
18bb0 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
18bc0 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
18bd0 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
18be0 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
18bf0 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
18c00 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
18c10 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
18c20 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
18c30 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
18c40 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
18c50 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
18c60 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
18c70 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
18c80 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
18c90 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
18ca0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
18cb0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
18cc0 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
18cd0 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
18ce0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
18cf0 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
18d00 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
18d10 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
18d20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
18d30 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
18d40 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
18d50 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
18d60 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
18d70 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
18d80 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
18d90 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
18da0 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
18db0 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
18dc0 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
18dd0 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
18de0 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
18df0 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
18e00 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
18e10 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
18e20 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
18e30 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
18e40 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
18e50 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
18e60 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
18e70 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
18e80 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
18e90 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
18ea0 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
18eb0 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
18ec0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
18ed0 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
18ee0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
18ef0 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
18f00 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
18f10 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
18f20 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
18f30 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
18f40 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
18f50 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
18f60 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
18f70 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
18f80 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
18f90 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
18fa0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
18fb0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
18fc0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18fd0 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
18fe0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
18ff0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
19000 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
19010 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
19020 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
19030 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
19040 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
19050 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
19060 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
19070 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
19080 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
19090 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
190a0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
190b0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
190c0 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
190d0 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
190e0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
190f0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
19100 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
19110 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
19120 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19130 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
19140 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
19150 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
19160 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
19170 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
19180 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
19190 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
191a0 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
191b0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
191c0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
191d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
191e0 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
191f0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
19200 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
19210 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
19220 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
19230 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
19240 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
19250 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
19260 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
19270 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
19280 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
19290 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
192a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
192b0 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
192c0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
192d0 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
192e0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
192f0 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
19300 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19310 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
19320 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
19330 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
19340 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
19350 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
19360 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
19370 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
19380 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
19390 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
193a0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
193b0 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
193c0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
193d0 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
193e0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
193f0 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
19400 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
19410 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
19420 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
19430 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
19440 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
19450 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
19460 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
19470 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
19480 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
19490 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
194a0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
194b0 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
194c0 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
194d0 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
194e0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
194f0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
19500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
19510 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
19520 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
19530 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
19540 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
19550 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
19560 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
19570 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
19580 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
19590 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
195a0 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
195b0 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
195c0 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
195d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
195e0 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
195f0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
19600 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
19610 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
19620 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
19630 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
19640 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
19650 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
19660 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
19670 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
19680 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
196a0 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
196b0 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
196c0 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
196d0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
196e0 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
196f0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
19700 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
19710 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
19720 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
19730 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
19740 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
19750 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
19760 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
19770 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
19780 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
19790 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
197a0 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
197b0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
197c0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
197d0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
197e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
197f0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
19800 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
19810 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
19820 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
19830 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
19840 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
19850 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
19860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19870 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
19880 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
19890 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
198a0 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
198b0 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
198c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
198d0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
198e0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
198f0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
19900 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
19910 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
19920 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
19930 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
19940 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
19950 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
19960 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
19970 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
19980 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
19990 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
199a0 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
199b0 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
199c0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
199d0 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
199e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
199f0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
19a00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19a10 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
19a20 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
19a30 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
19a40 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
19a50 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
19a60 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
19a70 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
19a80 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
19a90 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
19aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
19ab0 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
19ac0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
19ad0 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
19ae0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
19af0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
19b00 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
19b10 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
19b20 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19b30 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
19b40 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
19b50 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
19b60 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
19b70 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
19b80 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
19b90 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
19ba0 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
19bb0 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
19bc0 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
19bd0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
19be0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
19bf0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19c00 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
19c10 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
19c20 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
19c30 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
19c40 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
19c50 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
19c60 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
19c70 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
19c80 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
19c90 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
19ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19cb0 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
19cc0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
19cd0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
19ce0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
19cf0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
19d00 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
19d10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
19d20 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  KPT;.        pNe
19d30 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
19d40 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
19d50 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
19d60 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = i;.        p->
19d70 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
19d80 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
19d90 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
19da0 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
19db0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
19dc0 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
19dd0 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
19de0 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
19df0 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
19e00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19e10 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
19e20 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
19e30 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
19e40 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
19e50 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
19e60 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
19e70 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
19e80 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
19e90 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
19ea0 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
19eb0 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
19ec0 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
19ed0 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
19ee0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
19ef0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
19f00 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
19f10 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
19f20 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
19f30 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
19f40 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
19f50 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
19f60 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
19f70 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
19f80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
19f90 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
19fa0 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31  t)*(nOrderBy + 1
19fb0 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  ));.  if( aPermu
19fc0 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
19fd0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19fe0 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d  pItem;.    aPerm
19ff0 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42  ute[0] = nOrderB
1a000 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  y;.    for(i=1, 
1a010 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
1a020 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20  a; i<=nOrderBy; 
1a030 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1a040 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1a050 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1a060 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  Col>0 );.      a
1a070 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
1a080 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
1a090 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1a0a0 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
1a0b0 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
1a0c0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
1a0d0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
1a0e0 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
1a0f0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
1a100 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
1a110 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a120 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
1a130 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
1a140 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1a150 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
1a160 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
1a170 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1a180 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
1a190 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
1a1a0 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
1a1b0 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
1a1c0 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
1a1d0 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
1a1e0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1a1f0 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
1a200 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
1a210 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
1a220 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
1a230 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
1a240 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
1a250 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
1a260 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
1a270 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
1a280 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
1a290 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1a2a0 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
1a2b0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1a2c0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
1a2d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
1a2e0 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
1a2f0 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
1a300 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a310 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
1a320 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1a330 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1a340 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
1a350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a360 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1a370 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
1a380 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
1a390 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
1a3a0 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
1a3b0 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
1a3c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1a3d0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
1a3e0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
1a3f0 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
1a400 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
1a410 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
1a420 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
1a430 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
1a440 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
1a450 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
1a460 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
1a470 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
1a480 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
1a490 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
1a4a0 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
1a4b0 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
1a4c0 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
1a4d0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
1a4e0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
1a4f0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
1a500 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
1a510 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
1a520 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
1a530 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
1a540 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
1a550 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1a560 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1a570 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
1a580 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
1a590 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
1a5a0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
1a5b0 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
1a5c0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1a5d0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1a5e0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1a5f0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
1a600 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1a610 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
1a620 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a630 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
1a640 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a660 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1a670 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
1a680 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
1a690 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
1a6c0 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
1a6d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a6e0 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
1a6f0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
1a700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
1a710 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
1a720 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
1a730 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1a740 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
1a750 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
1a760 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
1a770 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1a780 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
1a790 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1a7a0 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
1a7b0 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
1a7c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a7d0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
1a7e0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1a7f0 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
1a800 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
1a810 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1a820 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
1a830 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1a840 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
1a850 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
1a860 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1a870 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1a880 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
1a890 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
1a8a0 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
1a8b0 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
1a8c0 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1a8d0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
1a8e0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1a8f0 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1a900 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a910 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1a920 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c  ne, regAddrA, 0,
1a930 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
1a940 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1a950 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29   "left SELECT"))
1a960 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
1a970 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
1a980 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
1a990 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
1a9a0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
1a9b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1a9c0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
1a9d0 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
1a9e0 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
1a9f0 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
1aa00 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1aa10 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1aa20 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  r1);..  /* Gener
1aa30 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1aa40 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1aa50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1aa60 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
1aa70 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
1aa80 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
1aa90 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
1aaa0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1aab0 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31  (v) + 1;.  addr1
1aac0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1aad0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
1aae0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1aaf0 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rB, 0, addrSelec
1ab00 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tB);.  VdbeComme
1ab10 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45  nt((v, "right SE
1ab20 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
1ab30 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
1ab40 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
1ab50 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
1ab60 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
1ab70 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
1ab80 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78  fset = 0;  .  ex
1ab90 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
1aba0 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
1abb0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
1abc0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
1abd0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42  Parse, p, &destB
1abe0 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
1abf0 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
1ac00 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
1ac10 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
1ac20 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69  e3VdbeEndCorouti
1ac30 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b  ne(v, regAddrB);
1ac40 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1ac50 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
1ac60 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
1ac70 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
1ac80 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
1ac90 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
1aca0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
1acb0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
1acc0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1acd0 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1ace0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
1acf0 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
1ad00 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
1ad10 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
1ad20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ad30 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
1ad40 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1ad60 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
1ad70 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
1ad80 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1ad90 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
1ada0 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
1adb0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
1adc0 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
1add0 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
1ade0 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
1adf0 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
1ae00 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1ae10 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
1ae20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
1ae30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
1ae40 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
1ae50 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
1ae60 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
1ae70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
1ae80 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1ae90 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
1aea0 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
1aeb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1aec0 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
1aed0 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
1aee0 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49   }.  sqlite3KeyI
1aef0 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70  nfoUnref(pKeyDup
1af00 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1af10 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1af20 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
1af30 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
1af40 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
1af50 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
1af60 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
1af70 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
1af80 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43    if( op==TK_EXC
1af90 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
1afa0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1afb0 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64  ddrEofA_noB = ad
1afc0 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e  drEofA = labelEn
1afd0 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  d;.  }else{  .  
1afe0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1aff0 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
1b000 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1b010 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
1b020 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b030 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1b040 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1b050 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
1b060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b070 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b080 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45  regAddrB, labelE
1b090 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nd);.           
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0b0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
1b0c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1b0d0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1b0e0 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
1b0f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1b100 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1b110 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c  d(p->nSelectRow,
1b120 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1b130 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Row);.  }..  /* 
1b140 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1b150 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
1b160 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
1b170 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
1b180 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1b190 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1b1a0 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
1b1b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1b1c0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1b1d0 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1b1e0 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66  addrEofA;.    if
1b1f0 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ( p->nSelectRow 
1b200 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  > pPrior->nSelec
1b210 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
1b220 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
1b230 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c  SelectRow;.  }el
1b240 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
1b250 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
1b260 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  of-B subroutine"
1b270 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42  ));.    addrEofB
1b280 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b290 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1b2a0 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1b2b0 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
1b2c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b2d0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1b2e0 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64  A, labelEnd); Vd
1b2f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b300 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1b310 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b  to(v, addrEofB);
1b320 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1b330 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1b340 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1b350 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
1b360 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1b370 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
1b380 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
1b390 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1b3a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1b3b0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1b3c0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
1b3d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b3e0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1b3f0 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
1b400 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b410 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b420 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1b430 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1b440 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1b450 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
1b460 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1b470 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
1b480 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1b490 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
1b4a0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1b4b0 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1b4c0 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
1b4d0 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
1b4e0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1b4f0 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
1b500 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1b510 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
1b520 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b530 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1b540 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1b550 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
1b560 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1b570 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1b580 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20  belCmpr);.  }.. 
1b590 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1b5a0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1b5b0 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f  case of A>B.  */
1b5c0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1b5d0 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73  nt((v, "A-gt-B s
1b5e0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1b5f0 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74  addrAgtB = sqlit
1b600 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1b610 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r(v);.  if( op==
1b620 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
1b630 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  _UNION ){.    sq
1b640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b650 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1b660 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
1b670 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1b680 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b690 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1b6a0 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1b6b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b6c0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1b6d0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1b6e0 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e  /* This code run
1b6f0 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61  s once to initia
1b700 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e  lize everything.
1b710 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1b720 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1b730 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddr1);.  sqlite3
1b740 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b750 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1b760 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b  , addrEofA_noB);
1b770 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b780 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1b790 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1b7a0 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1b7b0 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1b7c0 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  rage(v);..  /* I
1b7d0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
1b7e0 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
1b7f0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1b800 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
1b810 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
1b820 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1b830 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
1b840 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
1b850 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
1b860 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
1b870 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b880 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
1b890 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
1b8a0 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
1b8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b8c0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1b8d0 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
1b8e0 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
1b8f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1b900 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
1b910 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b920 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
1b930 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
1b940 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
1b950 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b960 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
1b970 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
1b980 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
1b990 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
1b9a0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1b9b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1b9c0 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
1b9d0 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74   /* Reassembly t
1b9e0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1b9f0 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
1ba00 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65  l be freed corre
1ba10 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  ctly.  ** by the
1ba20 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1ba30 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  n */.  if( p->pP
1ba40 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rior ){.    sqli
1ba50 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1ba60 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  db, p->pPrior);.
1ba70 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20    }.  p->pPrior 
1ba80 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69  = pPrior;.  pPri
1ba90 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a  or->pNext = p;..
1baa0 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
1bab0 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
1bac0 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
1bad0 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
1bae0 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
1baf0 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78  eries ****/.  ex
1bb00 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
1bb10 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
1bb20 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a  ub1, iSub2, 0);.
1bb30 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
1bb40 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64  >nErr!=0;.}.#end
1bb50 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
1bb60 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1bb70 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1bb80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1bb90 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74  IEW)../* An inst
1bba0 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75 62 73  ance of the Subs
1bbb0 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20  tContext object 
1bbc0 64 65 73 63 72 69 62 65 73 20 61 6e 20 73 75 62  describes an sub
1bbd0 73 74 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a  stitution edit.*
1bbe0 2a 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  * to be performe
1bbf0 64 20 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65  d on a parse tre
1bc00 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66  e..**.** All ref
1bc10 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
1bc20 6e 73 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62  ns in table iTab
1bc30 6c 65 20 61 72 65 20 74 6f 20 62 65 20 72 65 70  le are to be rep
1bc40 6c 61 63 65 64 20 62 79 20 63 6f 72 72 65 73 70  laced by corresp
1bc50 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73  onding.** expres
1bc60 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e  sions in pEList.
1bc70 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1bc80 63 74 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  ct SubstContext 
1bc90 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1bca0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1bcb0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1bcc0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
1bcd0 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
1bce0 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72      /* Replace r
1bcf0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
1bd00 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
1bd10 20 69 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20   iNewTable;     
1bd20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61         /* New ta
1bd30 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
1bd40 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20  int isLeftJoin; 
1bd50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1bd60 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20   TK_IF_NULL_ROW 
1bd70 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20  opcodes on each 
1bd80 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20  replacement */. 
1bd90 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1bda0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  t;         /* Re
1bdb0 70 6c 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73  placement expres
1bdc0 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74  sions */.} Subst
1bdd0 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72  Context;../* For
1bde0 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
1bdf0 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
1be00 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 53   substExprList(S
1be10 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78  ubstContext*, Ex
1be20 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
1be30 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1be40 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c  t(SubstContext*,
1be50 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a   Select*, int);.
1be60 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
1be70 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
1be80 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
1be90 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
1bea0 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
1beb0 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
1bec0 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
1bed0 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
1bee0 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
1bef0 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
1bf00 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
1bf10 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
1bf20 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
1bf30 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
1bf40 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
1bf50 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
1bf60 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
1bf70 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
1bf80 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
1bf90 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
1bfa0 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
1bfb0 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
1bfc0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
1bfd0 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
1bfe0 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
1bff0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
1c000 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
1c010 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
1c020 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1c030 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
1c040 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
1c050 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
1c060 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
1c070 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
1c080 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
1c090 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
1c0a0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1c0b0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1c0c0 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
1c0d0 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 53 75  *substExpr(.  Su
1c0e0 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62  bstContext *pSub
1c0f0 73 74 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74  st,  /* Descript
1c100 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1c110 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1c120 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
1c130 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
1c140 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
1c150 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20  n occurs */.){. 
1c160 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1c170 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1c180 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1c190 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
1c1a0 69 6e 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d  in).   && pExpr-
1c1b0 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c1c0 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1c1d0 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  .  ){.    pExpr-
1c1e0 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c1f0 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54   = pSubst->iNewT
1c200 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
1c210 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1c220 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
1c230 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69  Table==pSubst->i
1c240 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
1c250 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1c260 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
1c270 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
1c280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c290 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
1c2a0 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d     Expr *pCopy =
1c2b0 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d   pSubst->pEList-
1c2c0 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
1c2d0 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
1c2e0 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a  Expr ifNullRow;.
1c2f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1c300 75 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20  ubst->pEList!=0 
1c310 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
1c320 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74  n<pSubst->pEList
1c330 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1c340 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c350 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
1c360 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
1c370 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c380 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43  3ExprIsVector(pC
1c390 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  opy) ){.        
1c3a0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
1c3b0 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50  orMsg(pSubst->pP
1c3c0 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20  arse, pCopy);.  
1c3d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c3e0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1c3f0 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d   pSubst->pParse-
1c400 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >db;.        if(
1c410 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1c420 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70  oin && pCopy->op
1c430 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
1c440 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1c450 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73  &ifNullRow, 0, s
1c460 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29  izeof(ifNullRow)
1c470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e  );.          ifN
1c480 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49  ullRow.op = TK_I
1c490 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20  F_NULL_ROW;.    
1c4a0 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1c4b0 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20  pLeft = pCopy;. 
1c4c0 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1c4d0 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  ow.iTable = pSub
1c4e0 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1c4f0 20 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d           pCopy =
1c500 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20   &ifNullRow;.   
1c510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1c520 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1c530 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20  rDup(db, pCopy, 
1c540 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1c550 70 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e  pNew && pSubst->
1c560 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  isLeftJoin ){.  
1c570 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
1c580 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
1c590 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20  _CanBeNull);.   
1c5a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1c5b0 66 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48  f( pNew && ExprH
1c5c0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c5d0 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b  ,EP_FromJoin) ){
1c5e0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1c5f0 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c600 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74   = pExpr->iRight
1c610 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20  JoinTable;.     
1c620 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
1c630 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72  erty(pNew, EP_Fr
1c640 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20  omJoin);.       
1c650 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1c660 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1c670 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
1c680 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
1c690 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c6a0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45  else{.    if( pE
1c6b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e  xpr->op==TK_IF_N
1c6c0 55 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72  ULL_ROW && pExpr
1c6d0 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74  ->iTable==pSubst
1c6e0 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
1c6f0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1c700 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61  = pSubst->iNewTa
1c710 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ble;.    }.    p
1c720 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75  Expr->pLeft = su
1c730 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1c740 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c750 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1c760 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1c770 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  bst, pExpr->pRig
1c780 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
1c790 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c7a0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1c7b0 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
1c7c0 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1c7d0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
1c7e0 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
1c7f0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1c800 69 73 74 28 70 53 75 62 73 74 2c 20 70 45 78 70  ist(pSubst, pExp
1c810 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1c820 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c830 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20  pExpr;.}.static 
1c840 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1c850 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65  st(.  SubstConte
1c860 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44  xt *pSubst, /* D
1c870 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1c880 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a  e substitution *
1c890 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1c8a0 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist       /* Lis
1c8b0 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e  t to scan and in
1c8c0 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
1c8d0 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b  ubstitutes */.){
1c8e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1c8f0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1c900 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1c910 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1c920 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
1c930 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
1c940 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c  tExpr(pSubst, pL
1c950 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1c960 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
1c970 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1c980 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  .  SubstContext 
1c990 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63  *pSubst, /* Desc
1c9a0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ription of the s
1c9b0 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  ubstitution */. 
1c9c0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1c9d0 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
1c9e0 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
1c9f0 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1ca00 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
1ca10 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20  nt doPrior      
1ca20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74       /* Do subst
1ca30 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72  itutes on p->pPr
1ca40 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20  ior too */.){.  
1ca50 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
1ca60 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1ca70 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1ca80 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29  nt i;.  if( !p )
1ca90 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20   return;.  do{. 
1caa0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1cab0 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69  (pSubst, p->pELi
1cac0 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
1cad0 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70  prList(pSubst, p
1cae0 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
1caf0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1cb00 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72  Subst, p->pOrder
1cb10 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  By);.    p->pHav
1cb20 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1cb30 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69  pSubst, p->pHavi
1cb40 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ng);.    p->pWhe
1cb50 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  re = substExpr(p
1cb60 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65  Subst, p->pWhere
1cb70 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d  );.    pSrc = p-
1cb80 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72  >pSrc;.    asser
1cb90 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
1cba0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1cbb0 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
1cbc0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
1cbd0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
1cbe0 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c  stSelect(pSubst,
1cbf0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
1cc00 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
1cc10 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1cc20 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75  nc ){.        su
1cc30 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1cc40 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46  st, pItem->u1.pF
1cc50 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  uncArg);.      }
1cc60 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1cc70 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d   doPrior && (p =
1cc80 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29   p->pPrior)!=0 )
1cc90 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
1cca0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ccb0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1ccc0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1ccd0 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
1cce0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1ccf0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1cd00 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1cd10 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1cd20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1cd30 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
1cd40 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
1cd50 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s as a performan
1cd60 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
1cd70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1cd80 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
1cd90 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
1cda0 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
1cdb0 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a  ening occurs..**
1cdc0 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
1cdd0 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
1cde0 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
1cdf0 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1ce00 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
1ce10 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
1ce20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
1ce30 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1ce40 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
1ce50 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
1ce60 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
1ce70 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
1ce80 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
1ce90 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
1cea0 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
1ceb0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1cec0 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1ced0 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
1cee0 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
1cef0 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
1cf00 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
1cf10 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
1cf20 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
1cf30 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
1cf40 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
1cf50 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1cf60 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
1cf70 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
1cf80 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
1cf90 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
1cfa0 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
1cfb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1cfc0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1cfd0 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
1cfe0 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
1cff0 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
1d000 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
1d010 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1d020 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
1d030 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1d040 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
1d050 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1d060 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1d070 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  is simplificatio
1d080 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1d090 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1d0a0 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1d0b0 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1d0c0 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1d0d0 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1d0e0 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1d0f0 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1d100 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1d110 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1d120 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1d130 74 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63  tening is subjec
1d140 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
1d150 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a  ng constraints:.
1d160 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1d170 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1d180 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1d190 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1d1a0 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  s. Was:.**      
1d1b0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1d1c0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1d1d0 72 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  ry cannot both b
1d1e0 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
1d1f0 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1d200 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1d210 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1d220 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1d230 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
1d240 28 32 29 20 49 66 20 74 68 65 20 73 75 62 71 75  (2) If the subqu
1d250 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67  ery is an aggreg
1d260 61 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ate then.**     
1d270 20 20 20 28 32 61 29 20 74 68 65 20 6f 75 74 65     (2a) the oute
1d280 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1d290 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1d2a0 2a 20 20 20 20 20 20 20 20 28 32 62 29 20 74 68  *        (2b) th
1d2b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75  e outer query mu
1d2c0 73 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75  st not use subqu
1d2d0 65 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  eries.**        
1d2e0 20 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20       other than 
1d2f0 74 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61  the one FROM-cla
1d300 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61  use subquery tha
1d310 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  t is a candidate
1d320 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d330 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  for flattening. 
1d340 20 28 54 68 69 73 20 69 73 20 64 75 65 20 74 6f   (This is due to
1d350 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64   ticket [2f7170d
1d360 37 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20  73bf9abf80].**  
1d370 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
1d380 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a  2015-02-09.).**.
1d390 2a 2a 20 20 20 28 33 29 20 20 49 66 20 74 68 65  **   (3)  If the
1d3a0 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1d3b0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1d3c0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68  f a LEFT JOIN th
1d3d0 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61  en.**        (3a
1d3e0 29 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d  ) the subquery m
1d3f0 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1d400 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
1d410 33 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  3b) the FROM cla
1d420 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
1d430 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74  ery may not cont
1d440 61 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ain a virtual.**
1d450 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62               tab
1d460 6c 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  le and.**       
1d470 20 28 33 63 29 20 74 68 65 20 6f 75 74 65 72 20   (3c) the outer 
1d480 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1d490 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a   an aggregate..*
1d4a0 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1d4b0 73 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74  subquery can not
1d4c0 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a   be DISTINCT..**
1d4d0 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
1d4e0 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
1d4f0 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
1d500 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
1d510 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
1d520 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
1d530 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
1d540 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
1d550 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
1d560 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
1d570 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
1d580 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
1d590 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
1d5a0 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
1d5b0 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ries..**.**  (**
1d5c0 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
1d5d0 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
1d5e0 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
1d5f0 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a  queries.  Was:.*
1d600 2a 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20  *        If the 
1d610 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72  subquery is aggr
1d620 65 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72  egate, the outer
1d630 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1d640 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  e DISTINCT..**.*
1d650 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
1d660 71 75 65 72 79 20 6d 75 73 74 20 68 61 76 65 20  query must have 
1d670 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
1d680 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
1d690 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
1d6a0 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
1d6b0 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
1d6c0 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
1d6d0 61 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70  ause with the sp
1d6e0 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
1d6f0 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
1d700 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
1d710 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
1d720 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1d730 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
1d740 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
1d750 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1d760 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
1d770 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d780 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f   may not be a jo
1d790 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
1d7a0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1d7b0 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
1d7c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d7d0 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72   may not be aggr
1d7e0 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  egate..**.**  (*
1d7f0 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20  *)  Restriction 
1d800 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64  (10) was removed
1d810 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f   from the code o
1d820 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74  n 2005-02-05 but
1d830 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63   we.**        ac
1d840 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64  cidently carried
1d850 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72   the comment for
1d860 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d  ward until 2014-
1d870 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c  09-15.  Original
1d880 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .**        const
1d890 72 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73  raint: "If the s
1d8a0 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65  ubquery is aggre
1d8b0 67 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75  gate then the ou
1d8c0 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20  ter query .**   
1d8d0 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65       may not use
1d8e0 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20   LIMIT.".**.**  
1d8f0 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
1d900 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1d910 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1d920 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
1d930 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
1d940 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c    (**)  Not impl
1d950 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
1d960 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1d970 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
1d980 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
1d990 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
1d9a0 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
1d9b0 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
1d9c0 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
1d9d0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1d9e0 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  nd outer query m
1d9f0 61 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  ay not both use 
1da00 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
1da10 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1da20 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46   may not use OFF
1da30 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  SET..**.**  (15)
1da40 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71    If the outer q
1da50 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20  uery is part of 
1da60 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1da70 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20  t, then the.**  
1da80 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 6d        subquery m
1da90 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1daa0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
1dab0 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
1dac0 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
1dad0 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
1dae0 31 36 29 20 20 49 66 20 74 68 65 20 6f 75 74 65  16)  If the oute
1daf0 72 20 71 75 65 72 79 20 69 73 20 61 67 67 72 65  r query is aggre
1db00 67 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73  gate, then the s
1db10 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a  ubquery may not.
1db20 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f 52  **        use OR
1db30 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74  DER BY.  (Ticket
1db40 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73   #2942)  This us
1db50 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ed to not matter
1db60 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c  .**        until
1db70 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74   we introduced t
1db80 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
1db90 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a  ) function.  .**
1dba0 0a 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74 68  .**  (17)  If th
1dbb0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
1dbc0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1dbd0 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
1dbe0 28 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75  (17a) all compou
1dbf0 6e 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73  nd operators mus
1dc00 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1dc10 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
1dc20 28 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77  (17b) no terms w
1dc30 69 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65  ithin the subque
1dc40 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20  ry compound may 
1dc50 62 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20  be aggregate.** 
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20               or 
1dc70 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a  DISTINCT, and.**
1dc80 20 20 20 20 20 20 20 20 28 31 37 63 29 20 65 76          (17c) ev
1dc90 65 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ery term within 
1dca0 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
1dcb0 70 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65 20  pound must have 
1dcc0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  a FROM clause.**
1dcd0 20 20 20 20 20 20 20 20 28 31 37 64 29 20 74 68          (17d) th
1dce0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
1dcf0 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20  y not be.**     
1dd00 20 20 20 20 20 20 20 20 20 28 31 37 64 31 29 20           (17d1) 
1dd10 61 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a  aggregate, or.**
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
1dd30 37 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20 6f  7d2) DISTINCT, o
1dd40 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
1dd50 20 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e    (17d3) a join.
1dd60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1dd70 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1dd80 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1dd90 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1dda0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1ddb0 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1ddc0 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1ddd0 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1dde0 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1ddf0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1de00 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1de10 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1de20 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1de30 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1de40 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1de50 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1de60 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1de70 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1de80 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1de90 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1dea0 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1deb0 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1dec0 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1ded0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1dee0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1def0 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1df00 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1df10 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1df20 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1df30 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1df40 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1df50 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1df60 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1df70 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1df80 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1df90 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1dfa0 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1dfb0 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1dfc0 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1dfd0 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1dfe0 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1dff0 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1e000 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1e010 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1e020 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1e030 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1e040 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1e050 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1e060 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1e070 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1e080 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1e090 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1e0a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1e0b0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1e0c0 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1e0d0 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1e0e0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1e0f0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1e100 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66 20  **.**  (19)  If 
1e110 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1e120 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1e130 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1e140 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
1e150 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
1e160 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20  se..**.**  (20) 
1e170 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1e180 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1e190 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20  select, then it 
1e1a0 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  must not use.** 
1e1b0 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20         an ORDER 
1e1c0 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b  BY clause.  Tick
1e1d0 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f  et #3773.  We co
1e1e0 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63  uld relax this c
1e1f0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20  onstraint.**    
1e200 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20      somewhat by 
1e210 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20  saying that the 
1e220 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1e230 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73  ER BY clause mus
1e240 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65  t.**        appe
1e250 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64  ar as unmodified
1e260 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
1e270 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1e280 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20  ry.  But we.**  
1e290 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
1e2a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
1e2b0 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
1e2c0 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
1e2d0 2a 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20 74  *.**  (21)  If t
1e2e0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1e2f0 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20   LIMIT then the 
1e300 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1e310 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  not be.**       
1e320 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65   DISTINCT.  (See
1e330 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34   ticket [752e164
1e340 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  6fc])..**.**  (2
1e350 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1e360 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72 65   may not be a re
1e370 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a  cursive CTE..**.
1e380 2a 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75 6d  **  (**)  Subsum
1e390 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1e3a0 69 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61 73  ion (17d3).  Was
1e3b0 3a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71  : If the outer q
1e3c0 75 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20 20  uery is.**      
1e3d0 20 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54    a recursive CT
1e3e0 45 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d  E, then the sub-
1e3f0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1e400 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1e410 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 69  y..**        Thi
1e420 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73  s restriction is
1e430 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f   because transfo
1e440 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  rming the.**    
1e450 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20      parent to a 
1e460 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63  compound query c
1e470 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65  onfuses the code
1e480 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a   that handles.**
1e490 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76          recursiv
1e4a0 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c  e queries in mul
1e4b0 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a  tiSelect()..**.*
1e4c0 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1e4d0 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1e4e0 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1e4f0 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  te subqueries.  
1e500 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54  Was:.**        T
1e510 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
1e520 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
1e530 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68  ate that uses th
1e540 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29  e built-in min()
1e550 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f   or .**        o
1e560 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
1e570 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69  s.  (Without thi
1e580 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61  s restriction, a
1e590 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20   query like:.** 
1e5a0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78         "SELECT x
1e5b0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61   FROM (SELECT ma
1e5c0 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29  x(y), x FROM t1)
1e5d0 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65  " would not nece
1e5e0 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20  ssarily.**      
1e5f0 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c    return the val
1e600 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59  ue X for which Y
1e610 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a   was maximal.).*
1e620 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  *.**.** In this 
1e630 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
1e640 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
1e650 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
1e660 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
1e670 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
1e680 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
1e690 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
1e6a0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
1e6b0 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
1e6c0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
1e6d0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
1e6e0 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
1e6f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1e700 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
1e710 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
1e720 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
1e730 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
1e740 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
1e750 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
1e760 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
1e770 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
1e780 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
1e790 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
1e7a0 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
1e7b0 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
1e7c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1e7d0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
1e7e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1e7f0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1e800 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1e810 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1e820 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
1e830 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
1e840 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
1e850 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
1e860 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1e870 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
1e880 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
1e890 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
1e8a0 41 67 67 20 20 20 20 20 20 20 20 20 20 20 20 2f  Agg            /
1e8b0 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
1e8c0 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
1e8d0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1e8e0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1e8f0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
1e900 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
1e910 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
1e920 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
1e930 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55      /* Current U
1e940 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66  NION ALL term of
1e950 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79   the other query
1e960 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
1e970 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
1e980 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
1e990 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
1e9a0 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
1e9b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1e9c0 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
1e9d0 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
1e9e0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1e9f0 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
1ea00 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1ea10 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1ea20 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1ea30 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
1ea40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1ea50 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
1ea60 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
1ea70 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
1ea80 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
1ea90 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
1eaa0 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
1eab0 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61 72  */.  int iNewPar
1eac0 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c  ent = -1;/* Repl
1ead0 61 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f  acement table fo
1eae0 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  r iParent */.  i
1eaf0 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20  nt isLeftJoin = 
1eb00 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53  0; /* True if pS
1eb10 75 62 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ub is the right 
1eb20 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  side of a LEFT J
1eb30 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74  OIN */    .  int
1eb40 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1eb50 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1eb60 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1eb70 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
1eb80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1eb90 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1eba0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ebb0 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
1ebc0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
1ebd0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1ebe0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1ebf0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
1ec00 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
1ec10 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
1ec20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
1ec30 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ec40 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
1ec50 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
1ec60 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  ;.  if( Optimiza
1ec70 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1ec80 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
1ec90 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
1eca0 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
1ecb0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1ecc0 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
1ecd0 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
1ece0 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
1ecf0 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
1ed00 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
1ed10 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
1ed20 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
1ed30 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
1ed40 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
1ed50 3d 30 20 29 3b 0a 0a 20 20 70 53 75 62 53 72 63  =0 );..  pSubSrc
1ed60 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
1ed70 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
1ed80 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
1ed90 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
1eda0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1edb0 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
1edc0 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
1edd0 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
1ede0 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
1edf0 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
1ee00 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
1ee10 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1ee20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
1ee30 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
1ee40 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
1ee50 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
1ee60 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1ee70 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
1ee80 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
1ee90 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
1eea0 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
1eeb0 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
1eec0 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
1eed0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1eee0 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
1eef0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1ef00 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1ef10 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
1ef20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1ef30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
1ef40 2d 3e 70 52 69 67 68 74 20 29 20 72 65 74 75 72  ->pRight ) retur
1ef50 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73 74 72 69  n 0;   /* Restri
1ef60 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
1ef70 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1ef80 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21   & SF_Compound)!
1ef90 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d  =0 && pSub->pLim
1efa0 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  it ){.    return
1efb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1efe0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1eff0 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
1f000 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
1f010 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f030 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f040 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
1f050 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1f060 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72   SF_Distinct ) r
1f070 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f080 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f090 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (4)  */.  if( 
1f0a0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1f0b0 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
1f0c0 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
1f0d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f0e0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f0f0 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a  s (8)(9) */.  }.
1f100 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1f110 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1f120 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1f130 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f160 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f170 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1f180 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1f190 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1f1a0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1f1b0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f1c0 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1f1d0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1f1e0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1f1f0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f200 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f210 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1f220 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1f230 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1f240 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1f250 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1f260 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1f270 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1f280 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
1f290 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1f2a0 52 65 63 75 72 73 69 76 65 29 20 29 7b 0a 20 20  Recursive) ){.  
1f2b0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1f2c0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29  estrictions (22)
1f2d0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   */.  }..  /*.  
1f2e0 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  ** If the subque
1f2f0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1f300 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1f310 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65  T JOIN, then the
1f320 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 6d  .  ** subquery m
1f330 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1f340 20 69 74 73 65 6c 66 20 28 33 61 29 2e 20 45 78   itself (3a). Ex
1f350 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74 68 69  ample of why thi
1f360 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c  s is not.  ** al
1f370 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1f380 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1f390 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
1f3a0 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
1f3b0 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
1f3c0 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
1f3d0 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
1f3e0 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
1f3f0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
1f400 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
1f410 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
1f420 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
1f430 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20  e thing..  **.  
1f440 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  ** If the subque
1f450 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1f460 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1f470 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65  T JOIN, then the
1f480 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72   outer.  ** quer
1f490 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 61  y cannot be an a
1f4a0 67 67 72 65 67 61 74 65 2e 20 28 33 63 29 20 20  ggregate. (3c)  
1f4b0 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69 66  This is an artif
1f4c0 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 0a 20  act of the way. 
1f4d0 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20 61   ** aggregates a
1f4e0 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20 74  re processed - t
1f4f0 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68 61  here is no mecha
1f500 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e  nism to determin
1f510 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c 45  e if.  ** the LE
1f520 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73 68  FT JOIN table sh
1f530 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c  ould be all-NULL
1f540 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
1f550 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30  also tickets #30
1f560 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33  6, #350, and #33
1f570 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  00..  */.  if( (
1f580 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69  pSubitem->fg.joi
1f590 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
1f5a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65  )!=0 ){.    isLe
1f5b0 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20  ftJoin = 1;.    
1f5c0 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
1f5d0 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20  c>1 || isAgg || 
1f5e0 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53 72  IsVirtual(pSubSr
1f5f0 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b  c->a[0].pTab) ){
1f600 0a 20 20 20 20 20 20 2f 2a 20 20 28 33 61 29 20  .      /*  (3a) 
1f610 20 20 20 20 20 20 20 20 20 20 20 20 28 33 63 29              (3c)
1f620 20 20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20 20       (3b) */.   
1f630 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1f640 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
1f650 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e 55 4c  LITE_EXTRA_IFNUL
1f660 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66 28 20  LROW.  else if( 
1f670 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73 41 67  iFrom>0 && !isAg
1f680 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 74  g ){.    /* Sett
1f690 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20 74  ing isLeftJoin t
1f6a0 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50 5f 49  o -1 causes OP_I
1f6b0 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 73  fNullRow opcodes
1f6c0 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
1f6d0 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
1f6e0 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  y reference to a
1f6f0 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ny result column
1f700 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79 20 69   from subquery i
1f710 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20  n a join, even. 
1f720 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68 65     ** though the
1f730 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73 73  y are not necess
1f740 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ary.  This will 
1f750 73 74 72 65 73 73 2d 74 65 73 74 20 74 68 65 20  stress-test the 
1f760 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20 20  OP_IfNullRow .  
1f770 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a    ** opcode. */.
1f780 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d      isLeftJoin =
1f790 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
1f7a0 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
1f7b0 6e 20 28 31 37 29 3a 20 49 66 20 74 68 65 20 73  n (17): If the s
1f7c0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1f7d0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1f7e0 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1f7f0 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1f800 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1f810 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1f820 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1f830 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1f840 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1f850 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1f860 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1f870 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1f880 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1f890 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1f8a0 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1f8b0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1f8c0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1f8d0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1f8e0 74 72 69 63 74 69 6f 6e 20 28 32 30 29 20 2a 2f  triction (20) */
1f8f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1f900 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  sAgg || (p->selF
1f910 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1f920 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e  ct)!=0 || pSrc->
1f930 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  nSrc!=1 ){.     
1f940 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28 31   return 0; /* (1
1f950 37 64 31 29 2c 20 28 31 37 64 32 29 2c 20 6f 72  7d1), (17d2), or
1f960 20 28 31 37 64 33 29 20 2a 2f 0a 20 20 20 20 7d   (17d3) */.    }
1f970 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70  .    for(pSub1=p
1f980 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62  Sub; pSub1; pSub
1f990 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29  1=pSub1->pPrior)
1f9a0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f9b0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1f9c0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1f9d0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1f9e0 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
1f9f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fa00 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1fa10 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1fa20 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1fa30 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
1fa40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fa50 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a  Sub->pSrc!=0 );.
1fa60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1fa70 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
1fa80 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74  r==pSub1->pEList
1fa90 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1faa0 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c   if( (pSub1->sel
1fab0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1fac0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1fad0 65 29 29 21 3d 30 20 20 20 20 2f 2a 20 28 31 37  e))!=0    /* (17
1fae0 62 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20  b) */.       || 
1faf0 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
1fb00 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
1fb10 41 4c 4c 29 20 20 20 20 20 20 20 20 20 20 20 20  ALL)            
1fb20 20 20 20 20 20 2f 2a 20 28 31 37 61 29 20 2a 2f       /* (17a) */
1fb30 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31  .       || pSub1
1fb40 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20 20  ->pSrc->nSrc<1  
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb70 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20 20 20  /* (17c) */.    
1fb80 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
1fb90 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1fba0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1fbb0 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1fbc0 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
1fbd0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1fbe0 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28  (18). */.    if(
1fbf0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
1fc00 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1fc10 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1fc20 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
1fc30 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
1fc40 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1fc50 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69  rBy->a[ii].u.x.i
1fc60 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
1fc70 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1fc80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1fc90 2a 20 45 78 2d 72 65 73 74 72 69 63 74 69 6f 6e  * Ex-restriction
1fca0 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65 20   (23):.  ** The 
1fcb0 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20 74 68  only way that th
1fcc0 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74  e recursive part
1fcd0 20 6f 66 20 61 20 43 54 45 20 63 61 6e 20 63 6f   of a CTE can co
1fce0 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  ntain a compound
1fcf0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
1fd00 73 20 66 6f 72 20 74 68 65 20 73 75 62 71 75 65  s for the subque
1fd10 72 79 20 74 6f 20 62 65 20 6f 6e 65 20 74 65 72  ry to be one ter
1fd20 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42 75  m of a join.  Bu
1fd30 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 73 75  t if the.  ** su
1fd40 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1fd50 2c 20 74 68 65 6e 20 74 68 65 20 66 6c 61 74 74  , then the flatt
1fd60 65 6e 69 6e 67 20 68 61 73 20 61 6c 72 65 61 64  ening has alread
1fd70 79 20 62 65 65 6e 20 73 74 6f 70 70 65 64 20 62  y been stopped b
1fd80 79 0a 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69  y.  ** restricti
1fd90 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a 20  on (17d3).  */. 
1fda0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
1fdb0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1fdc0 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75 62  sive)==0 || pSub
1fdd0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a  ->pPrior==0 );..
1fde0 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
1fdf0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1fe00 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1fe10 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
1fe20 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
1fe30 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74  ,pParse,p,("flat
1fe40 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74  ten %s.%p from t
1fe50 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  erm %d\n",.     
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
1fe70 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53  ub->zSelName, pS
1fe80 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20  ub, iFrom));..  
1fe90 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
1fea0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
1feb0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1fec0 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
1fed0 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c  zName;.  TESTONL
1fee0 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75  Y(i =) sqlite3Au
1fef0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1ff00 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
1ff10 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63  , 0, 0);.  testc
1ff20 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44  ase( i==SQLITE_D
1ff30 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ENY );.  pParse-
1ff40 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
1ff50 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1ff60 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
1ff70 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1ff80 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
1ff90 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28  tatement, then (
1ffa0 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a  by restrictions.
1ffb0 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61    ** 17 and 18 a
1ffc0 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65  bove) it must be
1ffd0 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64   a UNION ALL and
1ffe0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
1fff0 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20  y must .  ** be 
20000 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
20010 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
20020 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52  T <expr-list> FR
20030 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29  OM (<sub-query>)
20040 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20   <where-clause> 
20050 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  .  **.  ** follo
20060 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52  wed by any ORDER
20070 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f   BY, LIMIT and/o
20080 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  r OFFSET clauses
20090 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a  . This block.  *
200a0 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f  * creates N-1 co
200b0 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  pies of the pare
200c0 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74  nt query without
200d0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
200e0 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46  IMIT or .  ** OF
200f0 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64  FSET clauses and
20100 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74   joins them to t
20110 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64  he left-hand-sid
20120 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
20130 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49  l.  ** using UNI
20140 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73  ON ALL operators
20150 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
20160 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
20170 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65  f simple.  ** se
20180 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20  lect statements 
20190 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
201a0 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  sub-query..  **.
201b0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
201c0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
201d0 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20  CT a+1 FROM (.  
201e0 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
201f0 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   x FROM tab.  **
20200 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
20210 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
20220 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a  LECT y FROM tab.
20230 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
20240 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
20250 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
20260 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a  ) FROM tab2.  **
20270 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d       ) WHERE a!=
20280 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a  5 ORDER BY 1.  *
20290 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  *.  ** Transform
202a0 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
202b0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
202c0 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
202d0 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   x+1!=5.  **    
202e0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
202f0 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46      SELECT y+1 F
20300 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b  ROM tab WHERE y+
20310 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
20320 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
20330 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
20340 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45  +1 FROM tab2 WHE
20350 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35  RE abs(z*2)+1!=5
20360 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  .  **     ORDER 
20370 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  BY 1.  **.  ** W
20380 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20  e call this the 
20390 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
203a0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a  ry flattening"..
203b0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d    */.  for(pSub=
203c0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53  pSub->pPrior; pS
203d0 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  ub; pSub=pSub->p
203e0 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
203f0 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78  ct *pNew;.    Ex
20400 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
20410 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
20420 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
20430 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
20440 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
20450 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
20460 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
20470 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  0;.    p->pSrc =
20480 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   0;.    p->pPrio
20490 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c  r = 0;.    p->pL
204a0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
204b0 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
204c0 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
204d0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
204e0 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
204f0 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b  pSub->zSelName);
20500 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
20510 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
20520 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
20530 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
20540 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
20550 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
20560 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
20570 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
20580 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
20590 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
205a0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
205b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
205c0 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
205d0 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
205e0 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
205f0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
20600 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
20610 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
20620 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20  arse,p,.        
20630 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   ("compound-subq
20640 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63  uery flattener c
20650 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20  reates %s.%p as 
20660 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  peer\n",.       
20670 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
20680 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a  , pNew));.    }.
20690 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
206a0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
206b0 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
206c0 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
206d0 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
206e0 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
206f0 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
20700 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
20710 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
20720 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
20730 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
20740 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
20750 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
20760 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
20770 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
20780 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
20790 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
207a0 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
207b0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
207c0 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
207d0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
207e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
207f0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
20800 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
20810 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
20820 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
20830 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
20840 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
20850 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
20860 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
20870 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
20880 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
20890 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
208a0 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
208b0 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
208c0 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
208d0 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
208e0 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
208f0 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
20900 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
20910 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
20920 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
20930 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
20940 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
20950 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
20960 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
20970 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
20980 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
20990 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
209a0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
209b0 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
209c0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
209d0 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
209e0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
209f0 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61  ( pTabToDel->nTa
20a00 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  bRef==1 ){.     
20a10 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
20a20 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
20a30 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
20a40 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
20a50 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
20a60 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
20a70 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
20a80 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
20a90 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
20aa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20ab0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61    pTabToDel->nTa
20ac0 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  bRef--;.    }.  
20ad0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
20ae0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
20af0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
20b00 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
20b10 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
20b20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
20b30 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
20b40 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
20b50 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
20b60 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
20b70 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
20b80 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
20b90 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
20ba0 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
20bb0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
20bc0 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
20bd0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
20be0 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
20bf0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
20c00 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
20c10 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
20c20 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
20c30 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
20c40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
20c50 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
20c60 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
20c70 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
20c80 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
20c90 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
20ca0 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
20cb0 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
20cc0 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
20cd0 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
20ce0 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
20cf0 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
20d00 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
20d10 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
20d20 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
20d30 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
20d40 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
20d50 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
20d60 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
20d70 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
20d80 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
20d90 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
20da0 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
20db0 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
20dc0 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
20dd0 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
20de0 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
20df0 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
20e00 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
20e10 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
20e20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
20e30 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
20e40 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
20e50 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
20e60 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
20e70 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
20e80 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
20e90 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
20ea0 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
20eb0 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
20ec0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
20ed0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
20ee0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
20ef0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
20f00 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
20f10 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
20f20 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
20f30 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
20f40 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
20f50 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
20f60 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
20f70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20f80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
20f90 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
20fa0 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
20fb0 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
20fc0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
20fd0 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
20fe0 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
20ff0 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
21000 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
21010 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
21020 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
21030 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21040 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
21050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21060 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
21070 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
21080 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
21090 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
210a0 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
210b0 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
210c0 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
210d0 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
210e0 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
210f0 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
21100 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
21110 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
21120 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
21130 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
21140 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
21150 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
21160 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
21170 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
21180 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
21190 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
211a0 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
211b0 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
211c0 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
211d0 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
211e0 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
211f0 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
21200 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
21210 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
21220 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
21230 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
21240 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
21250 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
21260 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
21270 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
21280 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34  FROM clause to 4
21290 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
212a0 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69  he middle slot i
212b0 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
212c0 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
212d0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20   to make space. 
212e0 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77     ** for the tw
212f0 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
21300 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
21310 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
21320 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
21330 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
21340 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
21350 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
21360 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
21370 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
21380 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
21390 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
213a0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
213b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
213c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
213d0 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
213e0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
213f0 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
21400 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
21410 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
21420 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
21430 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
21440 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
21450 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
21460 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
21470 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
21480 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
21490 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61  i+iFrom].fg.isTa
214a0 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
214b0 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
214c0 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
214d0 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50 61  i];.      iNewPa
214e0 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d 3e  rent = pSubSrc->
214f0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
21500 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
21510 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
21520 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
21530 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
21540 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
21550 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
21560 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
21570 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
21580 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
21590 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
215a0 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
215b0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
215c0 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
215d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
215e0 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
215f0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
21600 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
21610 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
21620 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
21630 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
21640 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
21650 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21670 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
21680 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
21690 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
216a0 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
216b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
216c0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
216d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
216e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
216f0 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
21700 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
21710 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
21720 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
21730 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
21740 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
21750 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
21760 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
21770 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
21780 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
21790 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
217a0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
217b0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
217c0 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
217d0 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
217e0 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
217f0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
21800 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
21810 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
21820 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
21830 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
21840 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
21850 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
21860 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21870 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
21880 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
21890 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
218a0 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
218b0 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
218c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
218d0 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
218e0 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
218f0 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
21900 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
21910 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
21920 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
21930 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
21940 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
21950 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
21960 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
21970 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
21980 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
21990 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
219a0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
219b0 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
219c0 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
219d0 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
219e0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
219f0 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
21a00 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
21a10 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
21a20 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
21a30 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
21a40 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
21a50 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
21a60 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
21a70 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
21a80 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
21a90 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
21aa0 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
21ab0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
21ac0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21ad0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
21ae0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
21af0 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f  ert( pSub->pPrio
21b00 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  r==0 );.      pP
21b10 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
21b20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
21b30 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
21b40 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
21b50 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
21b60 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
21b70 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
21b80 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e    if( isLeftJoin
21b90 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a  >0 ){.      setJ
21ba0 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20  oinExpr(pWhere, 
21bb0 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20  iNewParent);.   
21bc0 20 7d 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e   }.    pParent->
21bd0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
21be0 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65  ExprAnd(db, pWhe
21bf0 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  re, pParent->pWh
21c00 65 72 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62  ere);.    if( db
21c10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
21c20 30 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74  0 ){.      Subst
21c30 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20  Context x;.     
21c40 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
21c50 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
21c60 6c 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20  le = iParent;.  
21c70 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
21c80 3d 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20  = iNewParent;.  
21c90 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e      x.isLeftJoin
21ca0 20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20   = isLeftJoin;. 
21cb0 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20       x.pEList = 
21cc0 70 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  pSub->pEList;.  
21cd0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
21ce0 26 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b  &x, pParent, 0);
21cf0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
21d00 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
21d10 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
21d20 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
21d30 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
21d40 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
21d50 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
21d60 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
21d70 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
21d80 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
21d90 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
21da0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
21db0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
21dc0 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
21dd0 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
21de0 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
21df0 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
21e00 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
21e10 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
21e20 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
21e30 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
21e40 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
21e50 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
21e60 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
21e70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21e80 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
21e90 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
21ea0 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
21eb0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
21ec0 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
21ed0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
21ee0 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
21ef0 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
21f00 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
21f10 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
21f20 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
21f30 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
21f40 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69  (db, pSub1);..#i
21f50 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
21f60 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
21f70 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
21f80 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
21f90 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
21fa0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
21fb0 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29   flattening:\n")
21fc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
21fd0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
21fe0 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
21ff0 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  f..  return 1;.}
22000 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
22010 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
22020 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
22030 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22040 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69  T_VIEW) */....#i
22050 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
22060 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
22070 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
22080 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
22090 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73  *.** Make copies
220a0 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45   of relevant WHE
220b0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
220c0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
220d0 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57  ry into.** the W
220e0 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73  HERE clause of s
220f0 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c  ubquery.  Exampl
22100 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e:.**.**    SELE
22110 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
22120 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
22130 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   y FROM t1) WHER
22140 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
22150 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  **.** Transforme
22160 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  d into:.**.**   
22170 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
22180 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
22190 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20  -d AS y FROM t1 
221a0 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d  WHERE a=5 AND c-
221b0 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45  d=10).**     WHE
221c0 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
221d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20  .**.** The hope 
221e0 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  is that the term
221f0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
22200 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20  nner query will 
22210 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20  make it more.** 
22220 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
22230 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
22240 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
22250 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  n if:.**.**   (1
22260 29 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74 72  ) (** This restr
22270 69 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76  iction was remov
22280 65 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39  ed on 2017-09-29
22290 2e 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a  .  We used to.**
222a0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 61 6c             disal
222b0 6c 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  low this optimiz
222c0 61 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65 67  ation for aggreg
222d0 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2c 20  ate subqueries, 
222e0 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20  but now.**      
222f0 20 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f 77       it is allow
22300 65 64 20 62 79 20 70 75 74 74 69 6e 67 20 74 68  ed by putting th
22310 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
22320 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
22330 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se..**          
22340 20 54 68 65 20 61 64 64 65 64 20 48 41 56 49 4e   The added HAVIN
22350 47 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69 6e  G clause is poin
22360 74 6c 65 73 73 20 69 66 20 74 68 65 20 73 75 62  tless if the sub
22370 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20  query lacks.**  
22380 20 20 20 20 20 20 20 20 20 61 20 47 52 4f 55 50           a GROUP
22390 20 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75 74   BY clause.  But
223a0 20 73 75 63 68 20 61 20 48 41 56 49 4e 47 20 63   such a HAVING c
223b0 6c 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68 61  lause is also ha
223c0 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 20  rmless.**       
223d0 20 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f 65      so there doe
223e0 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20  s not appear to 
223f0 62 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f  be any reason to
22400 20 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69 63   add extra logic
22410 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 6f  .**           to
22420 20 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a 2a   suppress it. **
22430 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68  ).**.**   (2) Th
22440 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
22450 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
22460 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20  art of a common 
22470 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
22480 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68  ..**.**   (3) Th
22490 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61  e inner query ha
224a0 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
224b0 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e   (since the chan
224c0 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  ges to the WHERE
224d0 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20  .**       close 
224e0 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  would change the
224f0 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
22500 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  LIMIT)..**.**   
22510 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (4) The inner qu
22520 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
22530 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
22540 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63  FT JOIN.  (The c
22550 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65  aller.**       e
22560 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72 65 73  nforces this res
22570 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74  triction since t
22580 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
22590 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68   not have enough
225a0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d  .**       inform
225b0 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a  ation to know.).
225c0 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20  **.**   (5) The 
225d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
225e0 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
225f0 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  es in the ON or 
22600 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
22610 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
22620 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  JOIN..**.** Retu
22630 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67  rn 0 if no chang
22640 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20  es are made and 
22650 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20  non-zero if one 
22660 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c  or more WHERE cl
22670 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72  ause.** terms ar
22680 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74  e duplicated int
22690 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  o the subquery..
226a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75  */.static int pu
226b0 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
226c0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
226d0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
226e0 73 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20  se context (for 
226f0 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72  malloc() and err
22700 6f 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f  or reporting) */
22710 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
22720 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
22730 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20 57  subquery whose W
22740 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
22750 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a  o be augmented *
22760 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
22770 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
22780 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
22790 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
227a0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f   */.  int iCurso
227b0 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  r           /* C
227c0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
227d0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
227e0 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
227f0 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30  .  int nChng = 0
22800 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d  ;.  if( pWhere==
22810 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
22820 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c  if( pSubq->selFl
22830 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
22840 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ve ) return 0;  
22850 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
22860 32 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  2) */..#ifdef SQ
22870 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
22880 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 74  Only the first t
22890 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
228a0 64 20 63 61 6e 20 68 61 76 65 20 61 20 57 49 54  d can have a WIT
228b0 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 6d  H clause.  But m
228c0 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f  ake.  ** sure no
228d0 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61 72 65   other terms are
228e0 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63 75 72   marked SF_Recur
228f0 73 69 76 65 20 69 6e 20 63 61 73 65 20 73 6f 6d  sive in case som
22900 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73 0a 20  ething changes. 
22910 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74 75 72   ** in the futur
22920 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  e..  */.  {.    
22930 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a 20 20  Select *pX;  .  
22940 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20    for(pX=pSubq; 
22950 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  pX; pX=pX->pPrio
22960 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r){.      assert
22970 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20  ( (pX->selFlags 
22980 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 29  & (SF_Recursive)
22990 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  )==0 );.    }.  
229a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
229b0 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30  pSubq->pLimit!=0
229c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
229d0 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
229e0 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68   (3) */.  }.  wh
229f0 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d  ile( pWhere->op=
22a00 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e  =TK_AND ){.    n
22a10 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e  Chng += pushDown
22a20 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
22a30 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65  e, pSubq, pWhere
22a40 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73 6f  ->pRight, iCurso
22a50 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  r);.    pWhere =
22a60 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a   pWhere->pLeft;.
22a70 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61    }.  if( ExprHa
22a80 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
22a90 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20  ,EP_FromJoin) ) 
22aa0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
22ab0 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a  triction (5) */.
22ac0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22ad0 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
22ae0 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72  (pWhere, iCursor
22af0 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b  ) ){.    nChng++
22b00 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 75  ;.    while( pSu
22b10 62 71 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73  bq ){.      Subs
22b20 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20  tContext x;.    
22b30 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
22b40 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
22b50 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  db, pWhere, 0);.
22b60 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d        x.pParse =
22b70 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78   pParse;.      x
22b80 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f  .iTable = iCurso
22b90 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54  r;.      x.iNewT
22ba0 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
22bb0 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f        x.isLeftJo
22bc0 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e  in = 0;.      x.
22bd0 70 45 4c 69 73 74 20 3d 20 70 53 75 62 71 2d 3e  pEList = pSubq->
22be0 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4e  pEList;.      pN
22bf0 65 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 26  ew = substExpr(&
22c00 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  x, pNew);.      
22c10 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c  if( pSubq->selFl
22c20 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
22c30 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  te ){.        pS
22c40 75 62 71 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ubq->pHaving = s
22c50 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
22c60 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d  arse->db, pSubq-
22c70 3e 70 48 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b  >pHaving, pNew);
22c80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22c90 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68        pSubq->pWh
22ca0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
22cb0 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
22cc0 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20   pSubq->pWhere, 
22cd0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
22ce0 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75       pSubq = pSu
22cf0 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  bq->pPrior;.    
22d00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
22d10 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Chng;.}.#endif /
22d20 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
22d30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
22d40 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
22d50 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
22d60 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75  /../*.** The pFu
22d70 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  nc is the only a
22d80 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
22d90 6e 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  n in the query. 
22da0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a   Check to see.**
22db0 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
22dc0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
22dd0 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74   the min/max opt
22de0 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  imization. .**.*
22df0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
22e00 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
22e10 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
22e20 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e  timization, then
22e30 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61   set.** *ppMinMa
22e40 78 20 74 6f 20 62 65 20 61 6e 20 4f 52 44 45 52  x to be an ORDER
22e50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
22e60 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6f 70   used for the op
22e70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e  timization.** an
22e80 64 20 72 65 74 75 72 6e 20 65 69 74 68 65 72 20  d return either 
22e90 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
22ea0 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
22eb0 42 59 5f 4d 41 58 20 64 65 70 65 6e 64 69 6e 67  BY_MAX depending
22ec0 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72 20 70   on.** whether p
22ed0 46 75 6e 63 20 69 73 20 61 20 6d 69 6e 28 29 20  Func is a min() 
22ee0 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
22ef0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
22f00 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
22f10 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
22f20 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
22f30 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a  ation, return.**
22f40 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
22f50 4f 52 4d 41 4c 20 28 77 68 69 63 68 20 6d 75 73  ORMAL (which mus
22f60 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a  t be zero)..**.*
22f70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
22f80 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66  ust be called af
22f90 74 65 72 20 61 67 67 72 65 67 61 74 65 20 66 75  ter aggregate fu
22fa0 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  nctions have bee
22fb0 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62 75 74  n.** located but
22fc0 20 62 65 66 6f 72 65 20 74 68 65 69 72 20 61 72   before their ar
22fd0 67 75 6d 65 6e 74 73 20 68 61 76 65 20 62 65 65  guments have bee
22fe0 6e 20 73 75 62 6a 65 63 74 65 64 20 74 6f 20 61  n subjected to a
22ff0 67 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c  ggregate.** anal
23000 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ysis..*/.static 
23010 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 73  u8 minMaxQuery(s
23020 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
23030 20 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c 69 73   *pFunc, ExprLis
23040 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20  t **ppMinMax){. 
23050 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52   int eRet = WHER
23060 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
23070 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
23080 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72   value */.  Expr
23090 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
230a0 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Func->x.pList;  
230b0 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
230c0 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a  o agg function *
230d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
230e0 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20  zFunc;          
230f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
23100 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
23110 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f  unction pFunc */
23120 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
23130 64 65 72 42 79 3b 0a 20 20 75 38 20 73 6f 72 74  derBy;.  u8 sort
23140 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  Order;..  assert
23150 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29  ( *ppMinMax==0 )
23160 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 75 6e  ;.  assert( pFun
23170 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  c->op==TK_AGG_FU
23180 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20  NCTION );.  if( 
23190 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c  pEList==0 || pEL
231a0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
231b0 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7a  return eRet;.  z
231c0 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e  Func = pFunc->u.
231d0 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71  zToken;.  if( sq
231e0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
231f0 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
23200 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52  .    eRet = WHER
23210 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
23220 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
23230 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20  QLITE_SO_ASC;.  
23240 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
23250 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
23260 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
23270 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
23280 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73  DERBY_MAX;.    s
23290 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
232a0 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c  E_SO_DESC;.  }el
232b0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65  se{.    return e
232c0 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69  Ret;.  }.  *ppMi
232d0 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42 79 20  nMax = pOrderBy 
232e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
232f0 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
23300 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
23310 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20 64 62  OrderBy!=0 || db
23320 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23330 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
23340 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30   ) pOrderBy->a[0
23350 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f  ].sortOrder = so
23360 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74 75 72  rtOrder;.  retur
23370 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n eRet;.}../*.**
23380 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
23390 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
233a0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
233b0 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  nt is an aggrega
233c0 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  te query..** The
233d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
233e0 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
233f0 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
23400 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
23410 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
23420 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
23430 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
23440 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
23450 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
23460 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
23470 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
23480 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
23490 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
234a0 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
234b0 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
234c0 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
234d0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
234e0 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
234f0 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
23500 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
23510 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
23520 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
23530 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
23540 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
23550 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
23560 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
23570 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
23580 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
23590 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
235a0 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
235b0 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
235c0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
235d0 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
235e0 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
235f0 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
23600 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
23610 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
23620 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
23630 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
23640 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
23650 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
23660 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
23670 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
23680 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
23690 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
236a0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
236b0 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
236c0 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
236d0 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49   if( NEVER(pAggI
236e0 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29  nfo->nFunc==0) )
236f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
23700 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   (pAggInfo->aFun
23710 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  c[0].pFunc->func
23720 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
23730 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
23740 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
23750 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
23760 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
23770 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
23780 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
23790 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
237a0 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
237b0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
237c0 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
237d0 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
237e0 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
237f0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
23800 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
23810 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
23820 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
23830 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
23840 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
23850 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
23860 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
23870 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
23880 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
23890 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
238a0 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
238b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
238c0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
238d0 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
238e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
238f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
23900 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
23910 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
23920 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e  & pFrom->fg.isIn
23930 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54  dexedBy ){.    T
23940 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
23950 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
23960 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d  ar *zIndexedBy =
23970 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pFrom->u1.zInde
23980 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78  xedBy;.    Index
23990 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
239a0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
239b0 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
239c0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
239d0 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
239e0 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20  zIndexedBy); .  
239f0 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
23a00 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
23a10 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
23a20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23a30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
23a40 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
23a50 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29  , zIndexedBy, 0)
23a60 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
23a70 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
23a80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23a90 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
23aa0 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42  }.    pFrom->pIB
23ab0 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
23ac0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
23ad0 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
23ae0 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
23af0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
23b00 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
23b10 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
23b20 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
23b30 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
23b40 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
23b50 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
23b60 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
23b70 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
23b80 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
23b90 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
23ba0 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
23bb0 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
23bc0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
23bd0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
23be0 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
23bf0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
23c00 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
23c10 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
23c20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
23c30 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
23c40 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
23c50 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
23c60 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
23c70 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
23c80 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
23c90 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
23ca0 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
23cb0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
23cc0 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
23cd0 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
23ce0 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
23cf0 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
23d00 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
23d10 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
23d20 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
23d30 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
23d40 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
23d50 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
23d60 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
23d70 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
23d80 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
23d90 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
23da0 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
23db0 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
23dc0 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
23dd0 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
23de0 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
23df0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
23e00 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
23e10 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
23e20 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
23e30 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
23e40 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
23e50 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
23e60 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
23e70 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
23e80 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
23e90 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
23ea0 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
23eb0 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
23ec0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
23ed0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
23ee0 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
23ef0 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
23f00 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
23f10 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
23f20 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23f30 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
23f40 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
23f50 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
23f60 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
23f70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
23f80 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
23f90 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
23fa0 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
23fb0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
23fc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
23fd0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
23fe0 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
23ff0 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
24000 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
24010 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
24020 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
24030 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
24040 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
24050 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
24060 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
24070 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
24080 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
24090 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
240a0 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
240b0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
240c0 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
240d0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
240e0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
240f0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
24100 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
24110 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
24120 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
24130 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
24140 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
24150 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
24160 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
24170 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
24180 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
24190 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
241a0 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
241b0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
241c0 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
241d0 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
241e0 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
241f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
24200 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
24210 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
24220 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29   TK_ASTERISK, 0)
24230 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
24240 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
24250 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
24260 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
24270 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
24280 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
24290 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
242a0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e  Prior = 0;.  p->
242b0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  pNext = 0;.  p->
242c0 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  pWith = 0;.  p->
242d0 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
242e0 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65  Compound;.  asse
242f0 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
24300 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29   & SF_Converted)
24310 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46  ==0 );.  p->selF
24320 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65  lags |= SF_Conve
24330 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  rted;.  assert( 
24340 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
24350 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
24360 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
24370 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
24380 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
24390 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
243a0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
243b0 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  e if the FROM cl
243c0 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20  ause term pFrom 
243d0 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  has table-valued
243e0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67   function.** arg
243f0 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64  uments.  If it d
24400 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  oes, leave an er
24410 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
24420 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
24430 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69  .** non-zero, si
24440 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74  nce pFrom is not
24450 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61   allowed to be a
24460 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75   table-valued fu
24470 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
24480 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75  c int cannotBeFu
24490 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  nction(Parse *pP
244a0 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
244b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
244c0 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
244d0 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
244e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
244f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25 73  Msg(pParse, "'%s
24500 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74  ' is not a funct
24510 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61  ion", pFrom->zNa
24520 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
24530 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
24540 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
24550 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
24560 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69  .** Argument pWi
24570 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  th (which may be
24580 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f   NULL) points to
24590 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
245a0 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54  f nested .** WIT
245b0 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d  H contexts, from
245c0 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d   inner to outerm
245d0 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c  ost. If the tabl
245e0 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
245f0 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
24600 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73  element pItem is
24610 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e   really a common
24620 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f  -table-expressio
24630 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e  n (CTE) .** then
24640 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
24650 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65 66  r to the CTE def
24660 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  inition for that
24670 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73   table. Otherwis
24680 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c  e.** return NULL
24690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e  ..**.** If a non
246a0 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72  -NULL value is r
246b0 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70  eturned, set *pp
246c0 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74  Context to point
246d0 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20   to the With.** 
246e0 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20  object that the 
246f0 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c  returned CTE bel
24700 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ongs to..*/.stat
24710 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73  ic struct Cte *s
24720 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69 74  earchWith(.  Wit
24730 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20  h *pWith,       
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24750 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73  Current innermos
24760 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f  t WITH clause */
24770 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
24780 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20  t_item *pItem,  
24790 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
247a0 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73  e element to res
247b0 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a  olve */.  With *
247c0 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20  *ppContext      
247d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
247e0 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72 65  : WITH clause re
247f0 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e  turn value belon
24800 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f  gs to */.){.  co
24810 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
24820 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44  .  if( pItem->zD
24830 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a  atabase==0 && (z
24840 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  Name = pItem->zN
24850 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57  ame)!=0 ){.    W
24860 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  ith *p;.    for(
24870 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d  p=pWith; p; p=p-
24880 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20  >pOuter){.      
24890 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
248a0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
248b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
248c0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
248d0 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d  p(zName, p->a[i]
248e0 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
248f0 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65          *ppConte
24900 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
24910 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69    return &p->a[i
24920 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
24930 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
24940 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
24950 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
24960 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  tor maintains a 
24970 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20  stack of active 
24980 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20  WITH clauses.** 
24990 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d  with the inner-m
249a0 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
249b0 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70  being at the top
249c0 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   of the stack..*
249d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
249e0 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49 54  e pushes the WIT
249f0 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20  H clause passed 
24a00 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
24a10 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74  gument.** onto t
24a20 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
24a30 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74  ack. If argument
24a40 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c 20   bFree is true, 
24a50 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54  then this.** WIT
24a60 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65  H clause will ne
24a70 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66 72  ver be popped fr
24a80 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e  om the stack. In
24a90 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a   this case it.**
24aa0 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64   should be freed
24ab0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
24ac0 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e  Parse object. In
24ad0 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77 68   other cases, wh
24ae0 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20  en.** bFree==0, 
24af0 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20  the With object 
24b00 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c  will be freed al
24b10 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45 4c  ong with the SEL
24b20 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ECT .** statemen
24b30 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74 20  t with which it 
24b40 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a  is associated..*
24b50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
24b60 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  thPush(Parse *pP
24b70 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74  arse, With *pWit
24b80 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20  h, u8 bFree){.  
24b90 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30  assert( bFree==0
24ba0 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69   || (pParse->pWi
24bb0 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  th==0 && pParse-
24bc0 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29  >pWithToFree==0)
24bd0 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20   );.  if( pWith 
24be0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
24bf0 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57  Parse->pWith!=pW
24c00 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68  ith );.    pWith
24c10 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73  ->pOuter = pPars
24c20 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50  e->pWith;.    pP
24c30 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
24c40 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72  ith;.    if( bFr
24c50 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69  ee ) pParse->pWi
24c60 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68  thToFree = pWith
24c70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
24c80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
24c90 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
24ca0 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
24cb0 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
24cc0 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
24cd0 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
24ce0 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
24cf0 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
24d00 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
24d10 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
24d20 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
24d30 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
24d40 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
24d50 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
24d60 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
24d70 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
24d80 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
24d90 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
24da0 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
24db0 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
24dc0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
24dd0 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
24de0 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
24df0 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
24e00 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
24e10 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
24e20 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
24e30 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
24e40 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
24e50 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
24e60 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
24e70 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
24e80 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
24e90 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
24ea0 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
24eb0 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
24ec0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
24ed0 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
24ee0 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
24ef0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
24f00 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
24f10 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
24f20 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
24f30 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
24f40 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
24f50 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24f60 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20  From.){.  Parse 
24f70 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
24f80 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  r->pParse;.  sql
24f90 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
24fa0 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20  e->db;.  struct 
24fb0 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20  Cte *pCte;      
24fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
24fd0 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c  hed CTE (or NULL
24fe0 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f   if no match) */
24ff0 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20  .  With *pWith; 
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25010 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73     /* WITH claus
25020 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f  e that pCte belo
25030 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
25040 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
25050 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
25060 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
25070 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
25080 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28  , &pWith);.  if(
25090 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62   pCte ){.    Tab
250a0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78  le *pTab;.    Ex
250b0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
250c0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
250d0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  ;.    Select *pL
250e0 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
250f0 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
25100 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
25110 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61  t */.    int bMa
25120 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20  yRecursive;     
25130 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25140 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65  f compound joine
25150 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  d by UNION [ALL]
25160 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53   */.    With *pS
25170 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20  avedWith;       
25180 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
25190 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
251a0 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20  ->pWith */..    
251b0 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  /* If pCte->zCte
251c0 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  Err is non-NULL 
251d0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
251e0 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69  hen this is an i
251f0 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65  llegal.    ** re
25200 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
25210 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c  e to CTE pCte. L
25220 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
25230 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
25240 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e  rn.    ** early.
25250 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72   If pCte->zCteEr
25260 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
25270 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  this is not a re
25280 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
25290 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  e..    ** In thi
252a0 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e  s case, proceed.
252b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74    */.    if( pCt
252c0 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20  e->zCteErr ){.  
252d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
252e0 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65  Msg(pParse, pCte
252f0 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d  ->zCteErr, pCte-
25300 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
25310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
25320 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
25330 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  ( cannotBeFuncti
25340 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  on(pParse, pFrom
25350 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
25360 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73  E_ERROR;..    as
25370 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
25380 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f  b==0 );.    pFro
25390 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
253a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
253b0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
253c0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28  Table));.    if(
253d0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
253e0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
253f0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
25400 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e   1;.    pTab->zN
25410 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
25420 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  trDup(db, pCte->
25430 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62  zName);.    pTab
25440 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
25450 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
25460 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
25470 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
25480 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
25490 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
254a0 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
254b0 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  ral | TF_NoVisib
254c0 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72  leRowid;.    pFr
254d0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
254e0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
254f0 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
25500 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
25510 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
25520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
25530 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61  OMEM_BKPT;.    a
25540 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
25550 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  elect );..    /*
25560 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
25570 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  s a recursive CT
25580 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d  E. */.    pSel =
25590 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
255a0 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69  .    bMayRecursi
255b0 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d  ve = ( pSel->op=
255c0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d  =TK_ALL || pSel-
255d0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
255e0 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
255f0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
25600 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63  int i;.      Src
25610 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72  List *pSrc = pFr
25620 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  om->pSelect->pSr
25630 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  c;.      for(i=0
25640 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
25650 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
25660 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
25670 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63  m *pItem = &pSrc
25680 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
25690 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
256a0 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20  base==0 .       
256b0 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d    && pItem->zNam
256c0 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e!=0 .         &
256d0 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
256e0 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  Cmp(pItem->zName
256f0 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20  , pCte->zName). 
25700 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
25710 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
25720 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
25730 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
25740 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  Recursive = 1;. 
25750 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
25760 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
25770 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
25780 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69  gs |= SF_Recursi
25790 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ve;.        }.  
257a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
257b0 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63   /* Only one rec
257c0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
257d0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
257e0 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  / .    if( pTab-
257f0 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20  >nTabRef>2 ){.  
25800 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25810 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  Msg(.          p
25820 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65  Parse, "multiple
25830 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72   references to r
25840 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20  ecursive table: 
25850 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  %s", pCte->zName
25860 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
25870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
25880 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
25890 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61  ssert( pTab->nTa
258a0 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20  bRef==1 || .    
258b0 20 20 20 20 20 20 20 20 28 28 70 53 65 6c 2d 3e          ((pSel->
258c0 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75  selFlags&SF_Recu
258d0 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e  rsive) && pTab->
258e0 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  nTabRef==2 ));..
258f0 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
25900 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
25910 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
25920 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
25930 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
25940 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
25950 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  = pWith;.    if(
25960 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
25970 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
25980 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70  pPrior = pSel->p
25990 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73  Prior;.      ass
259a0 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69  ert( pPrior->pWi
259b0 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  th==0 );.      p
259c0 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70  Prior->pWith = p
259d0 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  Sel->pWith;.    
259e0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
259f0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72  ect(pWalker, pPr
25a00 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69  ior);.      pPri
25a10 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20  or->pWith = 0;. 
25a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25a30 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
25a40 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
25a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
25a60 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
25a70 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66  h;..    for(pLef
25a80 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70  t=pSel; pLeft->p
25a90 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65  Prior; pLeft=pLe
25aa0 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20  ft->pPrior);.   
25ab0 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d   pEList = pLeft-
25ac0 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  >pEList;.    if(
25ad0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a   pCte->pCols ){.
25ae0 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
25af0 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
25b00 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r!=pCte->pCols->
25b10 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
25b20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25b30 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
25b40 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73  %s has %d values
25b50 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
25b60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
25b70 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
25b80 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
25b90 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
25ba0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
25bb0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
25bc0 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20  pSavedWith;.    
25bd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25be0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
25bf0 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
25c00 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
25c10 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43   }..    sqlite3C
25c20 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
25c30 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
25c40 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
25c50 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
25c60 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
25c70 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ive ){.      if(
25c80 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
25c90 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
25ca0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
25cb0 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69  zCteErr = "multi
25cc0 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65  ple recursive re
25cd0 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20  ferences: %s";. 
25ce0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25cf0 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
25d00 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72  r = "recursive r
25d10 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75  eference in a su
25d20 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20  bquery: %s";.   
25d30 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
25d40 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
25d50 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
25d60 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74   }.    pCte->zCt
25d70 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  eErr = 0;.    pP
25d80 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
25d90 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20  avedWith;.  }.. 
25da0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25db0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
25dc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25dd0 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  _CTE./*.** If th
25de0 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20  e SELECT passed 
25df0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
25e00 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73  gument has an as
25e10 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a  sociated WITH .*
25e20 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74  * clause, pop it
25e30 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
25e40 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
25e50 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  f the Parse obje
25e60 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ct..**.** This f
25e70 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
25e80 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61  as the xSelectCa
25e90 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61  llback2() callba
25ea0 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33  ck by.** sqlite3
25eb0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77  SelectExpand() w
25ec0 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45  hen walking a SE
25ed0 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73  LECT tree to res
25ee0 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  olve table.** na
25ef0 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52  mes and other FR
25f00 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
25f10 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ts. .*/.static v
25f20 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74  oid selectPopWit
25f30 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  h(Walker *pWalke
25f40 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
25f50 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
25f60 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
25f70 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  ;.  if( OK_IF_AL
25f80 57 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65  WAYS_TRUE(pParse
25f90 2d 3e 70 57 69 74 68 29 20 26 26 20 70 2d 3e 70  ->pWith) && p->p
25fa0 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
25fb0 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69  With *pWith = fi
25fc0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
25fd0 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70  pWith;.    if( p
25fe0 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20  With!=0 ){.     
25ff0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
26000 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b  >pWith==pWith );
26010 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70  .      pParse->p
26020 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f  With = pWith->pO
26030 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  uter;.    }.  }.
26040 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
26050 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a  selectPopWith 0.
26060 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
26070 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
26080 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  Walker callback 
26090 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20  for "expanding" 
260a0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
260b0 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e  nt..** "Expandin
260c0 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74  g" means to do t
260d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
260e0 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
260f0 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
26100 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
26110 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
26120 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
26130 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
26140 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
26150 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
26160 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
26170 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
26180 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
26190 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
261a0 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
261b0 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
261c0 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
261d0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
261e0 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
261f0 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
26200 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
26210 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
26220 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
26230 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
26240 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
26250 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
26260 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
26270 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
26280 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
26290 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
262a0 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
262b0 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
262c0 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
262d0 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
262e0 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72  ssing up the per
262f0 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
26300 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
26310 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
26320 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
26330 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
26340 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
26350 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  commodate the NA
26360 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
26370 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
26380 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
26390 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
263a0 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
263b0 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
263c0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
263d0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
263e0 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
263f0 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
26400 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
26410 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
26420 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
26430 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
26440 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
26450 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
26460 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
26470 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
26480 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
26490 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
264a0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
264b0 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
264c0 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
264d0 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
264e0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
264f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
26500 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
26510 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
26520 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
26530 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
26540 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
26550 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
26560 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
26570 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
26580 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c  >db;.  Expr *pE,
26590 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72   *pRight, *pExpr
265a0 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73  ;.  u16 selFlags
265b0 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a   = p->selFlags;.
265c0 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61 67 73    u32 elistFlags
265d0 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46   = 0;..  p->selF
265e0 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
265f0 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ded;.  if( db->m
26600 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a  allocFailed  ){.
26610 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
26620 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  bort;.  }.  asse
26630 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
26640 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c 61 67  ;.  if( (selFlag
26650 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
26660 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
26670 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
26680 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
26690 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
266a0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
266b0 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
266c0 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20 29  TRUE(p->pWith) )
266d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74  {.    sqlite3Wit
266e0 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d  hPush(pParse, p-
266f0 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a  >pWith, 0);.  }.
26700 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
26710 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
26720 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
26730 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
26740 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
26750 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
26760 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
26770 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
26780 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
26790 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
267a0 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
267b0 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
267c0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
267d0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
267e0 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
267f0 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
26800 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
26810 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
26820 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
26830 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
26840 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
26850 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
26860 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
26870 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
26880 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
26890 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
268a0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
268b0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
268c0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
268d0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
268e0 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
268f0 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72  ursive==0 || pFr
26900 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20  om->pTab!=0 );. 
26910 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67     if( pFrom->fg
26920 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63  .isRecursive ) c
26930 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
26940 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
26950 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
26960 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
26970 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e     if( withExpan
26980 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  d(pWalker, pFrom
26990 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
269a0 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46  bort;.    if( pF
269b0 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65  rom->pTab ) {} e
269c0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
269d0 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
269e0 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
269f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
26a00 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
26a10 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
26a20 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
26a30 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
26a40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
26a50 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
26a60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
26a70 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
26a80 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
26a90 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b==0 );.      if
26aa0 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c  ( sqlite3WalkSel
26ab0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
26ac0 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  l) ) return WRC_
26ad0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46 72  Abort;.      pFr
26ae0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
26af0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
26b00 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
26b10 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
26b20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
26b30 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26b40 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
26b50 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Ref = 1;.      i
26b60 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  f( pFrom->zAlias
26b70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62   ){.        pTab
26b80 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
26b90 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 46  3DbStrDup(db, pF
26ba0 72 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  rom->zAlias);.  
26bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26bc0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
26bd0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
26be0 64 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25 70  db, "subquery_%p
26bf0 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
26c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
26c10 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
26c20 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65  or ){ pSel = pSe
26c30 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20  l->pPrior; }.   
26c40 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
26c50 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
26c60 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69  arse, pSel->pELi
26c70 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26  st,&pTab->nCol,&
26c80 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
26c90 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
26ca0 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
26cb0 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
26cc0 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
26cd0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
26ce0 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20  48576) );.      
26cf0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
26d00 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
26d10 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
26d20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
26d30 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
26d40 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
26d50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
26d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
26d70 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
26d80 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
26d90 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
26da0 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
26db0 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72  m(pParse, 0, pFr
26dc0 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  om);.      if( p
26dd0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
26de0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26df0 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52   if( pTab->nTabR
26e00 65 66 3e 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef>=0xffff ){.  
26e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
26e20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
26e30 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
26e40 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
26e50 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
26e60 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
26e70 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
26e80 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
26e90 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
26ea0 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
26eb0 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
26ec0 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  f++;.      if( !
26ed0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
26ee0 26 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  && cannotBeFunct
26ef0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
26f00 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  m) ){.        re
26f10 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26f20 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66        }.#if !def
26f30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
26f40 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
26f50 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
26f60 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
26f70 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
26f80 6c 28 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d  l(pTab) || pTab-
26f90 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
26fa0 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20      i16 nCol;.  
26fb0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26fc0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
26fd0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
26fe0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
26ff0 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  bort;.        as
27000 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
27010 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
27020 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
27030 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
27040 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70  tDup(db, pTab->p
27050 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
27060 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
27070 74 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e  tSetName(pFrom->
27080 70 53 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a  pSelect, pTab->z
27090 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Name);.        n
270a0 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
270b0 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ;.        pTab->
270c0 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20  nCol = -1;.     
270d0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
270e0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
270f0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
27100 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
27110 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  l = nCol;.      
27120 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
27130 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68      /* Locate th
27140 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79  e index named by
27150 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
27160 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20  clause, if any. 
27170 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
27180 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
27190 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  p(pParse, pFrom)
271a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
271b0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
271c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
271d0 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
271e0 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
271f0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
27200 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
27210 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
27220 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72  iled || sqlitePr
27230 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
27240 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
27250 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
27260 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  }..  /* For ever
27270 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
27280 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
27290 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
272a0 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
272b0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
272c0 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
272d0 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
272e0 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
272f0 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
27300 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
27310 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
27320 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
27330 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
27340 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52  ith the TK_ASTER
27350 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ISK operator for
27360 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
27370 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
27380 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e  olumn.  ** list.
27390 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
273a0 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
273b0 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
273c0 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70  STERISK.  ** exp
273d0 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
273e0 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20  and each one to 
273f0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
27400 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20  columns in.  ** 
27410 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
27420 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
27430 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
27440 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
27450 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
27460 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
27470 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
27480 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
27490 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
274a0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d  ; k++){.    pE =
274b0 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
274c0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
274d0 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op==TK_ASTERISK
274e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
274f0 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
27500 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
27510 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht!=0 );.    ass
27520 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
27530 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66  DOT || (pE->pLef
27540 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66  t!=0 && pE->pLef
27550 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b  t->op==TK_ID) );
27560 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
27570 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
27580 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  Right->op==TK_AS
27590 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a  TERISK ) break;.
275a0 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20 7c      elistFlags |
275b0 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d  = pE->flags;.  }
275c0 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
275d0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
275e0 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
275f0 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
27600 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
27610 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
27620 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
27630 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
27640 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
27650 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
27660 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
27670 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
27680 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
27690 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
276a0 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
276b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
276c0 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
276d0 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
276e0 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
276f0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
27700 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
27710 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
27720 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
27730 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
27740 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
27750 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
27760 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
27770 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
27780 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
27790 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
277a0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20   k++){.      pE 
277b0 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
277c0 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20 7c      elistFlags |
277d0 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  = pE->flags;.   
277e0 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e     pRight = pE->
277f0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
27800 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
27810 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d  _DOT || pRight!=
27820 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
27830 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49  E->op!=TK_ASTERI
27840 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28 70 45  SK.       && (pE
27850 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
27860 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
27870 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20 20 29  STERISK).      )
27880 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
27890 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
278a0 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
278b0 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
278c0 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
278d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
278e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
278f0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
27900 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b  ew, a[k].pExpr);
27910 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
27920 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
27930 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
27940 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
27950 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
27960 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
27970 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e  ->nExpr-1].zSpan
27980 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20   = a[k].zSpan;. 
27990 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e           a[k].zN
279a0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
279b0 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20     a[k].zSpan = 
279c0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
279d0 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
279e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
279f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
27a00 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
27a10 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
27a20 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
27a30 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
27a40 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
27a50 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
27a60 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
27a70 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
27a80 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
27a90 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
27aa0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
27ab0 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
27ac0 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
27ad0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
27ae0 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
27af0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70     assert( pE->p
27b00 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
27b10 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
27b20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
27b30 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56  ->pLeft, EP_IntV
27b40 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
27b50 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e     zTName = pE->
27b60 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
27b70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27b80 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
27b90 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
27ba0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
27bb0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
27bc0 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
27bd0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
27be0 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53  Tab;.          S
27bf0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46  elect *pSub = pF
27c00 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
27c10 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
27c20 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
27c30 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
27c40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
27c50 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20  chemaName = 0;. 
27c60 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
27c70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27c80 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  zTabName==0 ){. 
27c90 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
27ca0 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
27cb0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
27cc0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
27cd0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
27ce0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
27cf0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20   if( pSub==0 || 
27d00 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
27d10 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
27d20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
27d30 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20     pSub = 0;.   
27d40 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
27d50 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
27d60 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
27d70 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
27d80 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
27d90 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
27da0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
27db0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
27dc0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
27dd0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
27de0 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
27df0 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20  maName = iDb>=0 
27e00 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ? db->aDb[iDb].z
27e10 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20  DbSName : "*";. 
27e20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27e30 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
27e40 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
27e50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
27e60 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
27e70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
27e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
27e90 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
27ea0 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
27eb0 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
27ec0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
27ed0 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
27ee0 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
27ef0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
27f00 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
27f10 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
27f20 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
27f30 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
27f40 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
27f50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
27f60 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Name );.        
27f70 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
27f80 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20  & pSub.         
27f90 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61      && sqlite3Ma
27fa0 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62  tchSpanName(pSub
27fb0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
27fc0 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c  Span, 0, zTName,
27fd0 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   0)==0.         
27fe0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
27ff0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
28000 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
28010 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
28020 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
28030 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f  d as 'hidden', o
28040 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20  mit it from the 
28050 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
28060 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
28070 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74  et list unless t
28080 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 74 68  he SELECT has th
28090 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  e SF_IncludeHidd
280a0 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  en.            *
280b0 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20  * bit set..     
280c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
280d0 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65        if( (p->se
280e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c  lFlags & SF_Incl
280f0 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20  udeHidden)==0.  
28100 20 20 20 20 20 20 20 20 20 20 20 26 26 20 49 73             && Is
28110 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
28120 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20  ab->aCol[j]) .  
28130 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
28140 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
28150 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
28160 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
28170 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20  ableSeen = 1;.. 
28180 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
28190 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
281a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
281b0 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e   if( (pFrom->fg.
281c0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
281d0 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20  TURAL)!=0.      
281e0 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62            && tab
281f0 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
28200 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e  (pTabList, i, zN
28210 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20  ame, 0, 0).     
28220 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
28230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28240 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  n a NATURAL join
28250 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20  , omit the join 
28260 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
28270 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
28280 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68    ** table to th
28290 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a  e right of the j
282a0 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oin */.         
282b0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
282c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
282d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
282e0 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
282f0 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73  Index(pFrom->pUs
28300 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
28310 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28320 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
28330 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
28340 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
28350 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
28360 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
28370 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
28380 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
28390 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
283a0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
283b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
283c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
283d0 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
283e0 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
283f0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d  (db, TK_ID, zNam
28400 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28410 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65  zColname = zName
28420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  ;.            zT
28430 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  oFree = 0;.     
28440 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
28450 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
28460 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  ->nSrc>1 ){.    
28470 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
28480 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
28490 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
284a0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
284b0 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  ID, zTabName);. 
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
284d0 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
284e0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
284f0 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
28500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28510 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20  if( zSchemaName 
28520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28530 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
28540 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
28550 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a  , zSchemaName);.
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
28580 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
28590 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70  DOT, pLeft, pExp
285a0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
285b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
285c0 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
285d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
285e0 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71     zColname = sq
285f0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
28600 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
28610 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
28620 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
28630 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  ree = zColname;.
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
28650 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
28660 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
28670 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
28680 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28690 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
286a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
286b0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
286c0 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
286d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
286e0 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c  3TokenInit(&sCol
286f0 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b  name, zColname);
28700 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28710 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
28720 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ame(pParse, pNew
28730 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b  , &sColname, 0);
28740 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28750 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c   pNew && (p->sel
28760 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
28770 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20  dFrom)!=0 ){.   
28780 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
28790 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
287a0 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70  *pX = &pNew->a[p
287b0 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  New->nExpr-1];. 
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
287d0 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20   pSub ){.       
287e0 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
287f0 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
28800 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
28810 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
28820 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
28830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
28840 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
28850 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
28860 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
28870 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
28880 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
28890 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20  , "%s.%s.%s",.  
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288c0 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
288d0 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  Name, zTabName, 
288e0 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
288f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
28900 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
28910 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
28920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
28930 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61     pX->bSpanIsTa
28940 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  b = 1;.         
28950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
28960 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
28970 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, zToFree);.   
28980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28990 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
289a0 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
289b0 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
289c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
289d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
289e0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
289f0 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
28a00 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
28a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28a20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
28a30 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
28a40 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
28a50 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
28a60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28a70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
28a80 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
28a90 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
28aa0 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
28ab0 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  New;.  }.  if( p
28ac0 2d 3e 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ->pEList ){.    
28ad0 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
28ae0 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
28af0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
28b00 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  UMN] ){.      sq
28b10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28b20 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
28b30 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
28b40 74 20 73 65 74 22 29 3b 0a 20 20 20 20 20 20 72  t set");.      r
28b50 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
28b60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
28b70 65 6c 69 73 74 46 6c 61 67 73 20 26 20 28 45 50  elistFlags & (EP
28b80 5f 48 61 73 46 75 6e 63 7c 45 50 5f 53 75 62 71  _HasFunc|EP_Subq
28b90 75 65 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20  uery))!=0 ){.   
28ba0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
28bb0 3d 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75  = SF_ComplexResu
28bc0 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  lt;.    }.  }.  
28bd0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
28be0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
28bf0 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
28c00 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
28c10 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
28c20 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
28c30 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
28c40 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
28c50 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
28c60 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
28c70 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
28c80 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
28c90 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
28ca0 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
28cb0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
28cc0 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
28cd0 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
28ce0 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
28cf0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
28d00 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
28d10 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
28d20 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
28d30 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
28d40 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
28d50 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
28d60 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
28d70 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
28d80 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
28d90 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
28da0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
28db0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
28dc0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
28dd0 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
28de0 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
28df0 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45 43 54  alker for SELECT
28e00 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20   statements..** 
28e10 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
28e20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
28e30 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
28e40 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  tWalkNoop(Walker
28e50 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63   *NotUsed, Selec
28e60 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  t *NotUsed2){.  
28e70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28e80 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
28e90 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ed2);.  return W
28ea0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
28eb0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
28ec0 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73  ./*.** Always as
28ed0 73 65 72 74 2e 20 20 54 68 69 73 20 78 53 65 6c  sert.  This xSel
28ee0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70  ectCallback2 imp
28ef0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76  lementation prov
28f00 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 78  es that the.** x
28f10 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
28f20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64  is never invoked
28f30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
28f40 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72  3SelectWalkAsser
28f50 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  t2(Walker *NotUs
28f60 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  ed, Select *NotU
28f70 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
28f80 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
28f90 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
28fa0 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a   assert( 0 );.}.
28fb0 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69  #endif./*.** Thi
28fc0 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
28fd0 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
28fe0 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
28ff0 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
29000 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
29010 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
29020 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
29030 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
29040 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
29050 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
29060 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
29070 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
29080 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
29090 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
290a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
290b0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
290c0 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
290d0 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
290e0 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
290f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
29100 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
29110 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
29120 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
29130 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
29140 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
29150 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
29160 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
29170 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
29180 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
29190 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
291a0 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
291b0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
291c0 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
291d0 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
291e0 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
291f0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
29200 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
29210 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
29220 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
29230 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
29240 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
29250 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
29260 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
29270 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
29280 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52   OK_IF_ALWAYS_TR
29290 55 45 28 70 50 61 72 73 65 2d 3e 68 61 73 43 6f  UE(pParse->hasCo
292a0 6d 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20 20 77  mpound) ){.    w
292b0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
292c0 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
292d0 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
292e0 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63  ry;.    w.xSelec
292f0 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
29300 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
29310 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
29320 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c  t);.  }.  w.xSel
29330 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
29340 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
29350 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
29360 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69  k2 = selectPopWi
29370 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  th;.  sqlite3Wal
29380 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
29390 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
293a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
293b0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
293c0 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
293d0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
293e0 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
293f0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
29400 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
29410 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
29420 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
29430 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
29440 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
29450 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
29460 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
29470 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
29480 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
29490 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
294a0 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
294b0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
294c0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
294d0 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
294e0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
294f0 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
29500 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
29510 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
29520 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
29530 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
29540 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
29550 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
29560 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
29570 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
29580 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
29590 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
295a0 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
295b0 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
295c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
295d0 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
295e0 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
295f0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
29600 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
29610 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
29620 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
29630 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
29640 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
29650 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
29660 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
29670 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73  Resolved );.  as
29680 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
29690 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
296a0 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  nfo)==0 );.  p->
296b0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
296c0 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50  asTypeInfo;.  pP
296d0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
296e0 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69  pParse;.  pTabLi
296f0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
29700 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
29710 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
29720 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
29730 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
29740 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
29750 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
29760 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
29770 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
29780 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
29790 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
297a0 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
297b0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
297c0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
297d0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65  LECT */.      Se
297e0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
297f0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
29800 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
29810 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
29820 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
29830 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
29840 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29850 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
29860 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
29870 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
29880 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
29890 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
298a0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
298b0 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
298c0 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
298d0 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
298e0 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
298f0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
29900 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
29910 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
29920 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
29930 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
29940 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
29950 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
29960 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
29970 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
29980 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
29990 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
299a0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
299b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
299c0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
299d0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
299e0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
299f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
29a00 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65  kNoop;.  w.xSele
29a10 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
29a20 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
29a30 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
29a40 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
29a50 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
29a60 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
29a70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
29a80 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
29a90 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
29aa0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
29ab0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
29ac0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29ad0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
29ae0 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
29af0 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
29b00 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
29b10 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
29b20 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
29b30 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
29b40 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
29b50 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
29b60 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
29b70 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
29b80 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
29b90 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
29ba0 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
29bb0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
29bc0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
29bd0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
29be0 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
29bf0 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
29c00 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
29c10 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
29c20 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
29c30 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
29c40 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
29c50 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
29c60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
29c70 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
29c80 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
29c90 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
29ca0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
29cb0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
29cc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
29cd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
29ce0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
29cf0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
29d00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29d10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29d20 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
29d30 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
29d40 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
29d50 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
29d60 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
29d70 61 73 73 65 72 74 28 20 70 21 3d 30 20 7c 7c 20  assert( p!=0 || 
29d80 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
29d90 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
29da0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
29db0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
29dc0 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
29dd0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
29de0 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
29df0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
29e00 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
29e10 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
29e20 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
29e30 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
29e40 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
29e50 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
29e60 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
29e70 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
29e80 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
29e90 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
29ea0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
29eb0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
29ec0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
29ed0 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
29ee0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
29ef0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
29f00 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
29f10 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
29f20 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
29f30 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
29f40 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
29f50 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
29f60 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
29f70 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
29f80 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
29f90 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
29fa0 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
29fb0 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
29fc0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
29fd0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
29fe0 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
29ff0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
2a000 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
2a010 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2a020 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2a030 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2a040 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2a050 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
2a060 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
2a070 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
2a080 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
2a090 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
2a0a0 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
2a0b0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
2a0c0 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
2a0d0 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
2a0e0 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
2a0f0 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
2a100 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
2a110 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
2a120 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
2a130 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
2a140 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
2a150 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
2a160 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2a170 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
2a180 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2a190 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
2a1a0 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
2a1b0 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
2a1c0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
2a1d0 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
2a1e0 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
2a1f0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
2a200 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2a210 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2a220 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
2a230 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
2a240 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
2a250 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
2a260 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
2a270 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
2a280 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2a290 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a2a0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
2a2b0 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
2a2c0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
2a2d0 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
2a2e0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
2a2f0 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
2a300 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2a310 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
2a320 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2a330 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
2a340 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
2a350 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
2a360 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2a370 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
2a380 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2a390 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
2a3a0 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
2a3b0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
2a3c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2a3d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2a3e0 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
2a3f0 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
2a400 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
2a410 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
2a420 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
2a430 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
2a440 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
2a450 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
2a460 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
2a470 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2a480 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
2a490 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ist, 0, 0);.    
2a4a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a4b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2a4c0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
2a4d0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
2a4e0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2a500 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
2a510 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
2a520 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
2a530 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
2a540 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
2a550 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
2a560 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2a570 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
2a580 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
2a590 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2a5a0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
2a5b0 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
2a5c0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
2a5d0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
2a5e0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2a5f0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
2a600 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2a610 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
2a620 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
2a630 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
2a640 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2a650 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
2a660 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
2a670 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
2a680 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2a690 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
2a6a0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2a6b0 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
2a6c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2a6d0 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
2a6e0 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
2a6f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
2a700 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2a710 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46  beAppendP4(v, pF
2a720 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
2a730 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
2a740 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
2a750 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
2a760 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
2a770 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
2a780 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2a790 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
2a7a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2a7b0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
2a7c0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
2a7d0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
2a7e0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
2a7f0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2a800 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
2a810 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  egHit = 0;.  int
2a820 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30   addrHitTest = 0
2a830 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2a840 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
2a850 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
2a860 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
2a870 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
2a880 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
2a890 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
2a8a0 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
2a8b0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
2a8c0 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
2a8d0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
2a8e0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
2a8f0 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
2a900 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
2a910 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
2a920 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2a930 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
2a940 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
2a950 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
2a960 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
2a970 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
2a980 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
2a990 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
2a9a0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2a9b0 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
2a9c0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
2a9d0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
2a9e0 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53  st, regAgg, 0, S
2a9f0 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b  QLITE_ECEL_DUP);
2aa00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2aa10 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
2aa20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
2aa30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
2aa40 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
2aa50 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
2aa60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2aa70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
2aa80 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d  testcase( nArg==
2aa90 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63  0 );  /* Error c
2aaa0 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ondition */.    
2aab0 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67    testcase( nArg
2aac0 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20  >1 );   /* Also 
2aad0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
2aae0 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
2aaf0 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
2ab00 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
2ab10 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
2ab20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
2ab30 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
2ab40 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
2ab50 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
2ab60 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
2ab70 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
2ab80 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2ab90 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
2aba0 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
2abb0 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
2abc0 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
2abd0 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
2abe0 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
2abf0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
2ac00 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
2ac10 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
2ac20 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
2ac30 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2ac40 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2ac50 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
2ac60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2ac70 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
2ac80 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
2ac90 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
2aca0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
2acb0 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
2acc0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
2acd0 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48  cumulator ) regH
2ace0 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
2acf0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
2ad00 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2ad10 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48  OP_CollSeq, regH
2ad20 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  it, 0, 0, (char 
2ad30 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
2ad40 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
2ad50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ad60 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30  3(v, OP_AggStep0
2ad70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d  , 0, regAgg, pF-
2ad80 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  >iMem);.    sqli
2ad90 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
2ada0 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  v, pF->pFunc, P4
2adb0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
2adc0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2add0 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b  P5(v, (u8)nArg);
2ade0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2adf0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
2ae00 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
2ae10 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  gg, nArg);.    s
2ae20 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2ae30 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
2ae40 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
2ae50 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
2ae60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2ae70 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2ae80 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
2ae90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2aea0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2aeb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2aec0 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61  /* Before popula
2aed0 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
2aee0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20  ator registers, 
2aef0 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  clear the column
2af00 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68   cache..  ** Oth
2af10 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f  erwise, if any o
2af20 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63  f the required c
2af30 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
2af40 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
2af50 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74   .  ** in regist
2af60 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72  ers, sqlite3Expr
2af70 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f  Code() may use O
2af80 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20  P_SCopy to copy 
2af90 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74  the value.  ** t
2afa0 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20  o pC->iMem. But 
2afb0 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20  by the time the 
2afc0 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74  value is used, t
2afd0 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69  he original regi
2afe0 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61  ster.  ** may ha
2aff0 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e  ve been used, in
2b000 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75  validating the u
2b010 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72  nderlying buffer
2b020 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a   holding the.  *
2b030 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76  * text or blob v
2b040 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74  alue. See ticket
2b050 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20   [883034dcb5].. 
2b060 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72   **.  ** Another
2b070 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20   solution would 
2b080 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  be to change the
2b090 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74   OP_SCopy used t
2b0a0 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20  o copy cached.  
2b0b0 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20  ** values to an 
2b0c0 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20  OP_Copy..  */.  
2b0d0 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20  if( regHit ){.  
2b0e0 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20    addrHitTest = 
2b0f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b100 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48  1(v, OP_If, regH
2b110 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
2b120 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
2b130 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2b140 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
2b150 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
2b160 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
2b170 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
2b180 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
2b190 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2b1a0 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
2b1b0 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b  Expr, pC->iMem);
2b1c0 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
2b1d0 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
2b1e0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2b1f0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2b200 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54  ;.  if( addrHitT
2b210 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  est ){.    sqlit
2b220 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2b230 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a  , addrHitTest);.
2b240 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
2b250 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
2b260 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
2b270 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20   to the VDBE to 
2b280 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65  explain a simple
2b290 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65  .** count(*) que
2b2a0 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e  ry ("SELECT coun
2b2b0 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29  t(*) FROM pTab")
2b2c0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
2b2d0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2b2e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2b2f0 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
2b300 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2b310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b320 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
2b330 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
2b340 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
2b350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
2b360 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
2b370 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
2b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b390 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
2b3a0 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73  ed to optimize s
2b3b0 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  can, or NULL */.
2b3c0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
2b3d0 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
2b3e0 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20     int bCover = 
2b3f0 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73  (pIdx!=0 && (Has
2b400 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21  Rowid(pTab) || !
2b410 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
2b420 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63  x(pIdx)));.    c
2b430 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
2b440 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
2b450 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
2b460 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
2b470 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
2b480 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2b490 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
2b4a0 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
2b4b0 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2b4c0 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
2b4d0 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  "".    );.    sq
2b4e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2b4f0 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
2b500 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61  >pVdbe, OP_Expla
2b510 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
2b520 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71  ectId, 0, 0, zEq
2b530 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20  p, P4_DYNAMIC.  
2b540 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65    );.  }.}.#else
2b550 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
2b560 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62  nSimpleCount(a,b
2b570 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
2b580 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  * Context object
2b590 20 66 6f 72 20 68 61 76 69 6e 67 54 6f 57 68 65   for havingToWhe
2b5a0 72 65 45 78 70 72 43 62 28 29 2e 0a 2a 2f 0a 73  reExprCb()..*/.s
2b5b0 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57 68  truct HavingToWh
2b5c0 65 72 65 43 74 78 20 7b 0a 20 20 45 78 70 72 20  ereCtx {.  Expr 
2b5d0 2a 2a 70 70 57 68 65 72 65 3b 0a 20 20 45 78 70  **ppWhere;.  Exp
2b5e0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
2b5f0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  .};../*.** sqlit
2b600 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c  e3WalkExpr() cal
2b610 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61  lback used by ha
2b620 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a  vingToWhere()..*
2b630 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65  *.** If the node
2b640 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63   passed to the c
2b650 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f  allback is a TK_
2b660 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e  AND node, return
2b670 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75   .** WRC_Continu
2b680 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65  e to tell sqlite
2b690 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69  3WalkExpr() to i
2b6a0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63  terate through c
2b6b0 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a  hild nodes..**.*
2b6c0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
2b6d0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49  urn WRC_Prune. I
2b6e0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73  n this case, als
2b6f0 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a  o check if the .
2b700 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f  ** sub-expressio
2b710 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72  n matches the cr
2b720 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67  iteria for being
2b730 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48   moved to the WH
2b740 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49  ERE.** clause. I
2b750 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20  f so, add it to 
2b760 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2b770 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65   and replace the
2b780 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a   sub-expression.
2b790 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41  ** within the HA
2b7a0 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  VING expression 
2b7b0 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
2b7c0 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  "1"..*/.static i
2b7d0 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  nt havingToWhere
2b7e0 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70  ExprCb(Walker *p
2b7f0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2b800 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2b810 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b  r->op!=TK_AND ){
2b820 0a 20 20 20 20 73 74 72 75 63 74 20 48 61 76 69  .    struct Havi
2b830 6e 67 54 6f 57 68 65 72 65 43 74 78 20 2a 70 20  ngToWhereCtx *p 
2b840 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 48 61  = pWalker->u.pHa
2b850 76 69 6e 67 43 74 78 3b 0a 20 20 20 20 69 66 28  vingCtx;.    if(
2b860 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
2b870 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
2b880 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c  pWalker->pParse,
2b890 20 70 45 78 70 72 2c 20 70 2d 3e 70 47 72 6f 75   pExpr, p->pGrou
2b8a0 70 42 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71  pBy) ){.      sq
2b8b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c  lite3 *db = pWal
2b8c0 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  ker->pParse->db;
2b8d0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
2b8e0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
2b8f0 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
2b900 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
2b910 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20  Tokens[1], 0);. 
2b920 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
2b930 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
2b940 57 68 65 72 65 20 3d 20 2a 28 70 2d 3e 70 70 57  Where = *(p->ppW
2b950 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 53  here);.        S
2b960 57 41 50 28 45 78 70 72 2c 20 2a 70 4e 65 77 2c  WAP(Expr, *pNew,
2b970 20 2a 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20   *pExpr);.      
2b980 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2b990 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65  ExprAnd(db, pWhe
2b9a0 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  re, pNew);.     
2b9b0 20 20 20 2a 28 70 2d 3e 70 70 57 68 65 72 65 29     *(p->ppWhere)
2b9c0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = pNew;.      }
2b9d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2b9e0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
2b9f0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2ba00 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2ba10 20 54 72 61 6e 73 66 65 72 20 65 6c 69 67 69 62   Transfer eligib
2ba20 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  le terms from th
2ba30 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
2ba40 6f 66 20 61 20 71 75 65 72 79 2c 20 77 68 69 63  of a query, whic
2ba50 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65  h is.** processe
2ba60 64 20 61 66 74 65 72 20 67 72 6f 75 70 69 6e 67  d after grouping
2ba70 2c 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  , to the WHERE c
2ba80 6c 61 75 73 65 2c 20 77 68 69 63 68 20 69 73 20  lause, which is 
2ba90 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f 72 65  processed before
2baa0 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f  .** grouping. Fo
2bab0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71  r example, the q
2bac0 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  uery:.**.**   SE
2bad0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62  LECT * FROM <tab
2bae0 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 47  les> WHERE a=? G
2baf0 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47  ROUP BY b HAVING
2bb00 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a   b=? AND c=?.**.
2bb10 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
2bb20 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
2bb30 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74  SELECT * FROM <t
2bb40 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f  ables> WHERE a=?
2bb50 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20 42   AND b=? GROUP B
2bb60 59 20 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a  Y b HAVING c=?.*
2bb70 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20 74  *.** A term of t
2bb80 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73  he HAVING expres
2bb90 73 69 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c 65  sion is eligible
2bba0 20 66 6f 72 20 74 72 61 6e 73 66 65 72 20 69 66   for transfer if
2bbb0 20 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20   it consists.** 
2bbc0 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73  entirely of cons
2bbd0 74 61 6e 74 73 20 61 6e 64 20 65 78 70 72 65 73  tants and expres
2bbe0 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61  sions that are a
2bbf0 6c 73 6f 20 47 52 4f 55 50 20 42 59 20 74 65 72  lso GROUP BY ter
2bc00 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73 65 20 74  ms that.** use t
2bc10 68 65 20 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c  he "BINARY" coll
2bc20 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
2bc30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
2bc40 61 76 69 6e 67 54 6f 57 68 65 72 65 28 0a 20 20  avingToWhere(.  
2bc50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
2bc60 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
2bc70 70 42 79 2c 0a 20 20 45 78 70 72 20 2a 70 48 61  pBy,.  Expr *pHa
2bc80 76 69 6e 67 2c 20 0a 20 20 45 78 70 72 20 2a 2a  ving, .  Expr **
2bc90 70 70 57 68 65 72 65 0a 29 7b 0a 20 20 73 74 72  ppWhere.){.  str
2bca0 75 63 74 20 48 61 76 69 6e 67 54 6f 57 68 65 72  uct HavingToWher
2bcb0 65 43 74 78 20 73 43 74 78 3b 0a 20 20 57 61 6c  eCtx sCtx;.  Wal
2bcc0 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 0a 20 20  ker sWalker;..  
2bcd0 73 43 74 78 2e 70 70 57 68 65 72 65 20 3d 20 70  sCtx.ppWhere = p
2bce0 70 57 68 65 72 65 3b 0a 20 20 73 43 74 78 2e 70  pWhere;.  sCtx.p
2bcf0 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
2bd00 42 79 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73  By;..  memset(&s
2bd10 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Walker, 0, sizeo
2bd20 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73  f(sWalker));.  s
2bd30 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20  Walker.pParse = 
2bd40 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65  pParse;.  sWalke
2bd50 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
2bd60 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45  = havingToWhereE
2bd70 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72  xprCb;.  sWalker
2bd80 2e 75 2e 70 48 61 76 69 6e 67 43 74 78 20 3d 20  .u.pHavingCtx = 
2bd90 26 73 43 74 78 3b 0a 20 20 73 71 6c 69 74 65 33  &sCtx;.  sqlite3
2bda0 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65  WalkExpr(&sWalke
2bdb0 72 2c 20 70 48 61 76 69 6e 67 29 3b 0a 7d 0a 0a  r, pHaving);.}..
2bdc0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
2bdd0 65 65 20 69 66 20 74 68 65 20 70 54 68 69 73 20  ee if the pThis 
2bde0 65 6e 74 72 79 20 6f 66 20 70 54 61 62 4c 69 73  entry of pTabLis
2bdf0 74 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69 6e  t is a self-join
2be00 20 6f 66 20 61 20 70 72 69 6f 72 20 76 69 65 77   of a prior view
2be10 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74  ..** If it is, t
2be20 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 53  hen return the S
2be30 72 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72 20  rcList_item for 
2be40 74 68 65 20 70 72 69 6f 72 20 76 69 65 77 2e 20  the prior view. 
2be50 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a 2a   If it is not,.*
2be60 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e  * then return 0.
2be70 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
2be80 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2be90 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 0a  isSelfJoinView(.
2bea0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2beb0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ist,           /
2bec0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 73 65 6c  * Search for sel
2bed0 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73 20  f-joins in this 
2bee0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2bef0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2bf00 69 74 65 6d 20 2a 70 54 68 69 73 20 20 20 2f 2a  item *pThis   /*
2bf10 20 53 65 61 72 63 68 20 66 6f 72 20 70 72 69 6f   Search for prio
2bf20 72 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  r reference to t
2bf30 68 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  his subquery */.
2bf40 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
2bf50 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2bf60 0a 20 20 66 6f 72 28 70 49 74 65 6d 20 3d 20 70  .  for(pItem = p
2bf70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65  TabList->a; pIte
2bf80 6d 3c 70 54 68 69 73 3b 20 70 49 74 65 6d 2b 2b  m<pThis; pItem++
2bf90 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ){.    if( pItem
2bfa0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ->pSelect==0 ) c
2bfb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2bfc0 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
2bfd0 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74 69 6e  routine ) contin
2bfe0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
2bff0 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63 6f  m->zName==0 ) co
2c000 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2c010 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2c020 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
2c030 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74 61 62 61  , pThis->zDataba
2c040 73 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  se)!=0 ) continu
2c050 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
2c060 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d  e3_stricmp(pItem
2c070 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d 3e  ->zName, pThis->
2c080 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74  zName)!=0 ) cont
2c090 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
2c0a0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2c0b0 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  (0, .          p
2c0c0 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  This->pSelect->p
2c0d0 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Where, pItem->pS
2c0e0 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 2d  elect->pWhere, -
2c0f0 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  1) .    ){.     
2c100 20 2f 2a 20 54 68 65 20 76 69 65 77 20 77 61 73   /* The view was
2c110 20 6d 6f 64 69 66 69 65 64 20 62 79 20 73 6f 6d   modified by som
2c120 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
2c130 74 69 6f 6e 20 73 75 63 68 20 61 73 0a 20 20 20  tion such as.   
2c140 20 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e 57 68     ** pushDownWh
2c150 65 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a 20 20  ereTerms() */.  
2c160 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c170 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
2c180 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Item;.  }.  retu
2c190 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn 0;.}..#ifdef 
2c1a0 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49  SQLITE_COUNTOFVI
2c1b0 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EW_OPTIMIZATION.
2c1c0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
2c1d0 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 71 75 65   transform a que
2c1e0 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ry of the form.*
2c1f0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 63  *.**    SELECT c
2c200 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53 45  ount(*) FROM (SE
2c210 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 55  LECT x FROM t1 U
2c220 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
2c230 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a  y FROM t2).**.**
2c240 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Into this:.**.*
2c250 2a 20 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  *    SELECT (SEL
2c260 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2c270 4d 20 74 31 29 2b 28 53 45 4c 45 43 54 20 63 6f  M t1)+(SELECT co
2c280 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 0a  unt(*) FROM t2).
2c290 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 66  **.** The transf
2c2a0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f  ormation only wo
2c2b0 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  rks if all of th
2c2c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
2c2d0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
2c2e0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
2c2f0 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20   a UNION ALL of 
2c300 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  two or more term
2c310 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72 65 20  s.**   *  There 
2c320 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72 20 47  is no WHERE or G
2c330 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e  ROUP BY or HAVIN
2c340 47 20 63 6c 61 75 73 65 73 20 6f 6e 20 74 68 65  G clauses on the
2c350 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20   subqueries.**  
2c360 20 2a 20 20 54 68 65 20 6f 75 74 65 72 20 71 75   *  The outer qu
2c370 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20  ery is a simple 
2c380 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52  count(*).**.** R
2c390 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2c3a0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2c3b0 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f  s undertaken..*/
2c3c0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
2c3d0 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74  tOfViewOptimizat
2c3e0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
2c3f0 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2c400 20 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a   Select *pSub, *
2c410 70 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a  pPrior;.  Expr *
2c420 70 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70  pExpr;.  Expr *p
2c430 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  Count;.  sqlite3
2c440 20 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e   *db;.  if( (p->
2c450 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
2c460 67 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65  gregate)==0 ) re
2c470 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69  turn 0;   /* Thi
2c480 73 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  s is an aggregat
2c490 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45  e */.  if( p->pE
2c4a0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
2c4b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2c4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
2c4d0 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
2c4e0 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d 20 70 2d   */.  pExpr = p-
2c4f0 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
2c500 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
2c510 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
2c520 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
2c530 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  ;        /* Resu
2c540 6c 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  lt is an aggrega
2c550 74 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  te */.  if( sqli
2c560 74 65 33 5f 73 74 72 69 63 6d 70 28 70 45 78 70  te3_stricmp(pExp
2c570 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75  r->u.zToken,"cou
2c580 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nt") ) return 0;
2c590 20 20 2f 2a 20 49 73 20 63 6f 75 6e 74 28 29 20    /* Is count() 
2c5a0 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
2c5b0 78 2e 70 4c 69 73 74 21 3d 30 20 29 20 72 65 74  x.pList!=0 ) ret
2c5c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2c5d0 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
2c5e0 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20  e count(*) */.  
2c5f0 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  if( p->pSrc->nSr
2c600 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
2c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c620 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69    /* One table i
2c630 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20 20 70 53 75  n FROM  */.  pSu
2c640 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
2c650 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28  ].pSelect;.  if(
2c660 20 70 53 75 62 3d 3d 30 20 29 20 72 65 74 75 72   pSub==0 ) retur
2c670 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
2c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c690 2a 20 54 68 65 20 46 52 4f 4d 20 69 73 20 61 20  * The FROM is a 
2c6a0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  subquery */.  if
2c6b0 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d  ( pSub->pPrior==
2c6c0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
2c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6e0 2f 2a 20 4d 75 73 74 20 62 65 20 61 20 63 6f 6d  /* Must be a com
2c6f0 70 6f 75 6e 64 20 72 79 20 2a 2f 0a 20 20 64 6f  pound ry */.  do
2c700 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
2c710 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53  op!=TK_ALL && pS
2c720 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74  ub->pPrior ) ret
2c730 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20  urn 0;  /* Must 
2c740 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a  be UNION ALL */.
2c750 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57      if( pSub->pW
2c760 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c780 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52        /* No WHER
2c790 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  E clause */.    
2c7a0 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
2c7b0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2c7c0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
2c7d0 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67 72    /* Not an aggr
2c7e0 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70 53 75  egate */.    pSu
2c7f0 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  b = pSub->pPrior
2c800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c820 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20 63 6f  * Repeat over co
2c830 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77 68 69  mpound */.  }whi
2c840 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20 20 2f  le( pSub );..  /
2c850 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
2c860 69 73 20 70 6f 69 6e 74 20 74 68 65 6e 20 69 74  is point then it
2c870 20 69 73 20 4f 4b 20 74 6f 20 70 65 72 66 6f 72   is OK to perfor
2c880 6d 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  m the transforma
2c890 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  tion */..  db = 
2c8a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 43  pParse->db;.  pC
2c8b0 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  ount = pExpr;.  
2c8c0 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 75  pExpr = 0;.  pSu
2c8d0 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
2c8e0 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 2d 3e  ].pSelect;.  p->
2c8f0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
2c900 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ct = 0;.  sqlite
2c910 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
2c920 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70  b, p->pSrc);.  p
2c930 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
2c940 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
2c950 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
2c960 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20 77 68  *p->pSrc));.  wh
2c970 69 6c 65 28 20 70 53 75 62 20 29 7b 0a 20 20 20  ile( pSub ){.   
2c980 20 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a 20 20   Expr *pTerm;.  
2c990 20 20 70 50 72 69 6f 72 20 3d 20 70 53 75 62 2d    pPrior = pSub-
2c9a0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 53 75  >pPrior;.    pSu
2c9b0 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  b->pPrior = 0;. 
2c9c0 20 20 20 70 53 75 62 2d 3e 70 4e 65 78 74 20 3d     pSub->pNext =
2c9d0 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65   0;.    pSub->se
2c9e0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
2c9f0 72 65 67 61 74 65 3b 0a 20 20 20 20 70 53 75 62  regate;.    pSub
2ca00 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2ca10 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20  F_Compound;.    
2ca20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2ca30 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2ca40 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2ca50 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
2ca60 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  );.    pTerm = p
2ca70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65 33 45  Prior ? sqlite3E
2ca80 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f 75 6e  xprDup(db, pCoun
2ca90 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74 3b 0a  t, 0) : pCount;.
2caa0 20 20 20 20 70 53 75 62 2d 3e 70 45 4c 69 73 74      pSub->pEList
2cab0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
2cac0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
2cad0 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20   0, pTerm);.    
2cae0 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 50  pTerm = sqlite3P
2caf0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
2cb00 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20  SELECT, 0, 0);. 
2cb10 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 41     sqlite3PExprA
2cb20 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ddSelect(pParse,
2cb30 20 70 54 65 72 6d 2c 20 70 53 75 62 29 3b 0a 20   pTerm, pSub);. 
2cb40 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20     if( pExpr==0 
2cb50 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  ){.      pExpr =
2cb60 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c 73   pTerm;.    }els
2cb70 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  e{.      pExpr =
2cb80 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2cb90 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20 70  arse, TK_PLUS, p
2cba0 54 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a 20 20  Term, pExpr);.  
2cbb0 20 20 7d 0a 20 20 20 20 70 53 75 62 20 3d 20 70    }.    pSub = p
2cbc0 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Prior;.  }.  p->
2cbd0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
2cbe0 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 2d  pr = pExpr;.  p-
2cbf0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
2cc00 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 23 69 66  _Aggregate;..#if
2cc10 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2cc20 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
2cc30 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
2cc40 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x400 ){.    SEL
2cc50 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
2cc60 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
2cc70 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20 6f 70  count-of-view op
2cc80 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29  timization:\n"))
2cc90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2cca0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2ccb0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2ccc0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
2ccd0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2cce0 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49  COUNTOFVIEW_OPTI
2ccf0 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a  MIZATION */../*.
2cd00 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
2cd10 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20   for the SELECT 
2cd20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
2cd30 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e  in the p argumen
2cd40 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  t.  .**.** The r
2cd50 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72  esults are retur
2cd60 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ned according to
2cd70 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20   the SelectDest 
2cd80 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65  structure..** Se
2cd90 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71  e comments in sq
2cda0 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75  liteInt.h for fu
2cdb0 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f  rther informatio
2cdc0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
2cdd0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2cde0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2cdf0 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
2ce00 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
2ce10 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
2ce20 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
2ce30 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
2ce40 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
2ce50 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2ce60 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2ce70 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
2ce80 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
2ce90 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
2cea0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2ceb0 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
2cec0 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
2ced0 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
2cee0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2cef0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
2cf00 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
2cf10 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
2cf20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
2cf30 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
2cf40 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
2cf50 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
2cf60 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
2cf70 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
2cf80 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
2cf90 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
2cfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2cfb0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
2cfc0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2cfd0 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
2cfe0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
2cff0 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
2d000 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
2d010 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
2d020 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
2d030 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
2d040 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
2d050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d060 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
2d070 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
2d080 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
2d090 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20  st *pEList = 0; 
2d0a0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
2d0b0 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
2d0c0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
2d0d0 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
2d0e0 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
2d0f0 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
2d100 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
2d110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d120 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
2d130 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
2d140 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
2d150 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
2d160 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
2d170 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
2d180 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
2d190 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
2d1a0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
2d1b0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
2d1c0 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
2d1d0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2d1e0 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
2d1f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
2d200 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44    DistinctCtx sD
2d210 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f  istinct; /* Info
2d220 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
2d230 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
2d240 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74  word */.  SortCt
2d250 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20  x sSort;        
2d260 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
2d270 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45  to code the ORDE
2d280 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2d290 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
2d2a0 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
2d2b0 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
2d2c0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
2d2d0 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
2d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d2f0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
2d300 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
2d310 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2d320 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2d330 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
2d340 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
2d350 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 4f 72 64  List *pMinMaxOrd
2d360 65 72 42 79 20 3d 20 30 3b 20 20 2f 2a 20 41 64  erBy = 0;  /* Ad
2d370 64 65 64 20 4f 52 44 45 52 20 42 59 20 66 6f 72  ded ORDER BY for
2d380 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65 73   min/max queries
2d390 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d 61 78 46   */.  u8 minMaxF
2d3a0 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  lag;            
2d3b0 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 66 6f 72       /* Flag for
2d3c0 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65 73   min/max queries
2d3d0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2d3e0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2d3f0 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53  .  int iRestoreS
2d400 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
2d410 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70  ->iSelectId;.  p
2d420 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2d430 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74   = pParse->iNext
2d440 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64  SelectId++;.#end
2d450 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  if..  db = pPars
2d460 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d  e->db;.  if( p==
2d470 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
2d480 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
2d490 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
2d4a0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2d4b0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
2d4c0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
2d4d0 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
2d4e0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2d4f0 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
2d500 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
2d510 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45  Info));.#if SELE
2d520 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2d530 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2d540 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c  tIndent++;.  SEL
2d550 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
2d560 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f  e,p, ("begin pro
2d570 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  cessing:\n"));. 
2d580 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2d590 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2d5a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
2d5b0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2d5c0 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2d5d0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  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 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61  _DistFifo );.  a
2d610 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2d620 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2d630 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20  eDest!=SRT_Fifo 
2d640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2d650 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2d660 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2d670 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20  _DistQueue );.  
2d680 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2d690 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2d6a0 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75  >eDest!=SRT_Queu
2d6b0 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72  e );.  if( Ignor
2d6c0 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
2d6d0 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
2d6e0 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
2d6f0 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
2d700 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
2d710 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
2d720 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2d730 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
2d740 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2d750 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20  T_Discard ||.   
2d760 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2d770 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20  Dest==SRT_Queue 
2d780 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d790 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c  ==SRT_DistFifo |
2d7a0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
2d7b0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
2d7c0 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73  istQueue || pDes
2d7d0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69  t->eDest==SRT_Fi
2d7e0 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f  fo);.    /* If O
2d7f0 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f  RDER BY makes no
2d800 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
2d810 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e  he output then n
2d820 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20  either does.    
2d830 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69  ** DISTINCT so i
2d840 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  t can be removed
2d850 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c   too. */.    sql
2d860 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2d870 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
2d880 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  By);.    p->pOrd
2d890 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
2d8a0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
2d8b0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20  _Distinct;.  }. 
2d8c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
2d8d0 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ep(pParse, p, 0)
2d8e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72  ;.  memset(&sSor
2d8f0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f  t, 0, sizeof(sSo
2d900 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f  rt));.  sSort.pO
2d910 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2d920 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74  erBy;.  pTabList
2d930 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66   = p->pSrc;.  if
2d940 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2d950 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2d960 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
2d970 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
2d980 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
2d990 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67  st!=0 );.  isAgg
2d9a0 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
2d9b0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
2d9c0 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  =0;.#if SELECTTR
2d9d0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
2d9e0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2d9f0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2da00 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2da10 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20  0x100,pParse,p, 
2da20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  ("after name res
2da30 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  olution:\n"));. 
2da40 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2da50 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2da60 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2da70 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65   /* Get a pointe
2da80 72 20 74 68 65 20 56 44 42 45 20 75 6e 64 65 72  r the VDBE under
2da90 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61   construction, a
2daa0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
2dab0 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  VDBE if one.  **
2dac0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
2dad0 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d  y exist */.  v =
2dae0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
2daf0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
2db00 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
2db10 74 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 44 65  t_end;.  if( pDe
2db20 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
2db30 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
2db40 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
2db50 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
2db60 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c  ..  /* Try to fl
2db70 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
2db80 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2db90 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20  use up into the 
2dba0 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a  main query.  */.
2dbb0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2dbc0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2dbd0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
2dbe0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
2dbf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
2dc00 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
2dc10 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
2dc20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
2dc30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2dc40 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
2dc50 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  i];.    Select *
2dc60 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
2dc70 65 6c 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65  elect;.    Table
2dc80 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
2dc90 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 53  pTab;.    if( pS
2dca0 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
2dcb0 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20  ;..    /* Catch 
2dcc0 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20  mismatch in the 
2dcd0 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73  declared columns
2dce0 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74   of a view and t
2dcf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
2dd00 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
2dd10 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65  he SELECT on the
2dd20 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20   RHS */.    if( 
2dd30 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62  pTab->nCol!=pSub
2dd40 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
2dd50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2dd60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2dd70 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f   "expected %d co
2dd80 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62  lumns for '%s' b
2dd90 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20  ut got %d",.    
2dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddb0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54    pTab->nCol, pT
2ddc0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d  ab->zName, pSub-
2ddd0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
2dde0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
2ddf0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
2de00 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79     /* Do not try
2de10 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61   to flatten an a
2de20 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
2de30 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
2de40 20 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61   Flattening an a
2de50 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
2de60 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  y is only possib
2de70 6c 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  le if the outer 
2de80 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20  query.    ** is 
2de90 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74  not a join.  But
2dea0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
2deb0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
2dec0 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71  n, then the subq
2ded0 75 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  uery.    ** will
2dee0 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   be implemented 
2def0 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
2df00 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
2df10 61 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20  advantage to.   
2df20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   ** flattening i
2df30 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
2df40 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75   */.    if( (pSu
2df50 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2df60 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29  _Aggregate)!=0 )
2df70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
2df80 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72  ssert( pSub->pGr
2df90 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  oupBy==0 );..   
2dfa0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72   /* If the outer
2dfb0 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
2dfc0 61 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75  a "complex" resu
2dfd0 6c 74 20 73 65 74 20 28 74 68 61 74 20 69 73 2c  lt set (that is,
2dfe0 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72  .    ** if the r
2dff0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
2e000 20 6f 75 74 65 72 20 71 75 65 72 79 20 75 73 65   outer query use
2e010 73 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73  s functions or s
2e020 75 62 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a  ubqueries).    *
2e030 2a 20 61 6e 64 20 69 66 20 74 68 65 20 73 75 62  * and if the sub
2e040 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
2e050 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2e060 65 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20  e and if.    ** 
2e070 69 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  it will be imple
2e080 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
2e090 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20  outine, then do 
2e0a0 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68  not flatten.  Th
2e0b0 69 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69  is.    ** restri
2e0c0 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c  ction allows SQL
2e0d0 20 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65   constructs like
2e0e0 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
2e0f0 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70    **  SELECT exp
2e100 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2e110 78 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f  x).    **    FRO
2e120 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
2e130 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20   tab ORDER BY y 
2e140 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a  LIMIT 10);.    *
2e150 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70  *.    ** The exp
2e160 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2e170 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74  ) is only comput
2e180 65 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77  ed on the 10 row
2e190 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72  s that.    ** ar
2e1a0 65 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72  e output, rather
2e1b0 20 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20   than every row 
2e1c0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
2e1d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2e1e0 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
2e1f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2e200 20 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20   have a complex 
2e210 72 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a  result set.    *
2e220 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61  * means that fla
2e230 74 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63  ttening does occ
2e240 75 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51  ur on simpler SQ
2e250 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  L constraints wi
2e260 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65  thout.    ** the
2e270 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
2e280 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20  ion() like:.    
2e290 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43  **.    **  SELEC
2e2a0 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
2e2b0 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45   x FROM tab ORDE
2e2c0 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29  R BY y LIMIT 10)
2e2d0 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ;.    */.    if(
2e2e0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21   pSub->pOrderBy!
2e2f0 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a  =0.     && i==0.
2e300 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46       && (p->selF
2e310 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65  lags & SF_Comple
2e320 78 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20  xResult)!=0.    
2e330 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
2e340 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
2e350 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  || (pTabList->a[
2e360 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28  1].fg.jointype&(
2e370 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
2e380 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
2e390 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2e3a0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61    }..    if( fla
2e3b0 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
2e3c0 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
2e3d0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
2e3e0 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
2e3f0 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
2e400 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
2e410 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
2e420 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
2e430 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2e440 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2e450 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2e460 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
2e470 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
2e480 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
2e490 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2e4a0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2e4b0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2e4c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2e4d0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2e4e0 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c  ELECT.  /* Handl
2e4f0 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
2e500 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  T statements usi
2e510 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ng the separate 
2e520 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20  multiSelect().  
2e530 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20  ** procedure..  
2e540 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
2e550 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
2e560 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
2e570 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
2e580 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2e590 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2e5a0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2e5b0 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45  electId);.#if SE
2e5c0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2e5d0 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  D.    SELECTTRAC
2e5e0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
2e5f0 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
2e600 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
2e610 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
2e620 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
2e630 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2e640 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2e650 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68  f..  /* For each
2e660 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2e670 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f  M clause, do two
2e680 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31   things:.  ** (1
2e690 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e 72  ) Authorized unr
2e6a0 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 73  eferenced tables
2e6b0 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72 61  .  ** (2) Genera
2e6c0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
2e6d0 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f  sub-queries.  */
2e6e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
2e6f0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2e700 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2e710 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2e720 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2e730 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
2e740 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
2e750 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23 69 66  elect *pSub;.#if
2e760 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2e770 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
2e780 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
2e790 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
2e7a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2e7b0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
2e7c0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2e7d0 49 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45 41  Issue SQLITE_REA
2e7e0 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73  D authorizations
2e7f0 20 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f 6c   with a fake col
2e800 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79  umn name for any
2e810 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74  .    ** tables t
2e820 68 61 74 20 61 72 65 20 72 65 66 65 72 65 6e 63  hat are referenc
2e830 65 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69 63  ed but from whic
2e840 68 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65 20  h no values are 
2e850 65 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20 2a  extracted..    *
2e860 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  * Examples of wh
2e870 65 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73 20  ere these kinds 
2e880 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52  of null SQLITE_R
2e890 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  EAD authorizatio
2e8a0 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ns.    ** would 
2e8b0 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20  occur:.    **.  
2e8c0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2e8d0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
2e8e0 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45  ;   -- SQLITE_RE
2e8f0 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20  AD t1."".    ** 
2e900 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20      SELECT t1.* 
2e910 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d  FROM t1, t2;   -
2e920 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32  - SQLITE_READ t2
2e930 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ."".    **.    *
2e940 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d  * The fake colum
2e950 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70  n name is an emp
2e960 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69  ty string.  It i
2e970 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  s possible for a
2e980 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a   table to.    **
2e990 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e   have a column n
2e9a0 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70 74  amed by the empt
2e9b0 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69  y string, in whi
2e9c0 63 68 20 63 61 73 65 20 74 68 65 72 65 20 69 73  ch case there is
2e9d0 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a   no way to.    *
2e9e0 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65  * distinguish be
2e9f0 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72  tween an unrefer
2ea00 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20  enced table and 
2ea10 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72 65  an actual refere
2ea20 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  nce to the.    *
2ea30 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  * "" column. The
2ea40 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
2ea50 20 77 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b   was for the fak
2ea60 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f  e column name to
2ea70 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20   be a NULL,.    
2ea80 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  ** which would b
2ea90 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20  e unambiguous.  
2eaa0 42 75 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f  But legacy autho
2eab0 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
2eac0 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  ks might.    ** 
2ead0 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d  assume the colum
2eae0 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55  n name is non-NU
2eaf0 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e  LL and segfault.
2eb00 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20    The use of an 
2eb10 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74 72  empty.    ** str
2eb20 69 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b 65  ing for the fake
2eb30 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65   column name see
2eb40 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f  ms safer..    */
2eb50 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2eb60 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20  colUsed==0 ){.  
2eb70 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43      sqlite3AuthC
2eb80 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
2eb90 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d  ITE_READ, pItem-
2eba0 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65  >zName, "", pIte
2ebb0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
2ebc0 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
2ebd0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
2ebe0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
2ebf0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2ec00 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65  _VIEW).    /* Ge
2ec10 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2ec20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
2ec30 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2ec40 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53  se.    */.    pS
2ec50 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
2ec60 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75  ect;.    if( pSu
2ec70 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2ec80 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d  ..    /* Sometim
2ec90 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
2eca0 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20  a subquery will 
2ecb0 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72  be generated mor
2ecc0 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e  e than.    ** on
2ecd0 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75  ce, if the subqu
2ece0 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74  ery is part of t
2ecf0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2ed00 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a  in a LEFT JOIN,.
2ed10 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70      ** for examp
2ed20 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
2ed30 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65  e, do not regene
2ed40 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
2ed50 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a   manifest.    **
2ed60 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63   a view or the c
2ed70 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70  o-routine to imp
2ed80 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20  lement a view.  
2ed90 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  The first instan
2eda0 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66  ce.    ** is suf
2edb0 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20  ficient, though 
2edc0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
2edd0 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76  o manifest the v
2ede0 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20  iew does need.  
2edf0 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b    ** to be invok
2ee00 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20  ed again. */.   
2ee10 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72   if( pItem->addr
2ee20 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20  FillSub ){.     
2ee30 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76   if( pItem->fg.v
2ee40 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29  iaCoroutine==0 )
2ee50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2ee60 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2ee70 20 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20 76   manifests the v
2ee80 69 65 77 20 6d 69 67 68 74 20 62 65 20 61 20 6f  iew might be a o
2ee90 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c  ne-time routine,
2eea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 69  .        ** or i
2eeb0 74 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  t might need to 
2eec0 62 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63 68  be rerun on each
2eed0 20 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61 75   iteration becau
2eee0 73 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a 2a  se it.        **
2eef0 20 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72 65   encodes a corre
2ef00 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 2e 20  lated subquery. 
2ef10 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  */.        testc
2ef20 61 73 65 28 20 73 71 6c 69 74 65 33 56 64 62 65  ase( sqlite3Vdbe
2ef30 47 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e  GetOp(v, pItem->
2ef40 61 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70  addrFillSub)->op
2ef50 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b  code==OP_Once );
2ef60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ef70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2ef80 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72  _Gosub, pItem->r
2ef90 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  egReturn, pItem-
2efa0 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
2efb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
2efc0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
2efd0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
2efe0 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
2eff0 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
2f000 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
2f010 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
2f020 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
2f030 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74  this, the parent
2f040 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69   select. The chi
2f050 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a  ld select.    **
2f060 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70   may contain exp
2f070 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66  ression trees of
2f080 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20   at most.    ** 
2f090 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  (SQLITE_MAX_EXPR
2f0a0 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65  _DEPTH-Parse.nHe
2f0b0 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68  ight) height. Th
2f0c0 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20  is is a bit.    
2f0d0 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61  ** more conserva
2f0e0 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73  tive than necess
2f0f0 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61  ary, but much ea
2f100 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63  sier than enforc
2f110 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78  ing.    ** an ex
2f120 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a  act limit..    *
2f130 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  /.    pParse->nH
2f140 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33  eight += sqlite3
2f150 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
2f160 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  (p);..    /* Mak
2f170 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73  e copies of cons
2f180 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73  tant WHERE-claus
2f190 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f  e terms in the o
2f1a0 75 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a  uter query down.
2f1b0 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68      ** inside th
2f1c0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  e subquery.  Thi
2f1d0 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73  s can help the s
2f1e0 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d  ubquery to run m
2f1f0 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e  ore efficiently.
2f200 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2f210 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
2f220 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d  ype & JT_OUTER)=
2f230 3d 30 0a 20 20 20 20 20 26 26 20 70 75 73 68 44  =0.     && pushD
2f240 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50  ownWhereTerms(pP
2f250 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70  arse, pSub, p->p
2f260 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43  Where, pItem->iC
2f270 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23 69  ursor).    ){.#i
2f280 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2f290 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20  ABLED.      if( 
2f2a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2f2b0 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2f2c0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
2f2d0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
2f2e0 2c 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63  ,("After WHERE-c
2f2f0 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a  lause push-down:
2f300 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  \n"));.        s
2f310 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2f320 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2f330 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2f340 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41    }..    zSavedA
2f350 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
2f360 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
2f370 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  t;.    pParse->z
2f380 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
2f390 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  tem->zName;..   
2f3a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2f3b0 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
2f3c0 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
2f3d0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75  **.    ** The su
2f3e0 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d  bquery is implem
2f3f0 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
2f400 75 74 69 6e 65 20 69 66 20 74 68 65 20 73 75 62  utine if the sub
2f410 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20  query is.    ** 
2f420 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2f430 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
2f440 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  (so that it does
2f450 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
2f460 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20      ** computed 
2f470 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a  more than once).
2f480 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f      **.    ** TO
2f490 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74  DO: Are there ot
2f4a0 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69  her reasons besi
2f4b0 64 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20  de (1) to use a 
2f4c0 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  co-routine.    *
2f4d0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
2f4e0 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ?.    */.    if(
2f4f0 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70   i==0.     && (p
2f500 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
2f510 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2f520 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e  (pTabList->a[1].
2f530 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f  fg.jointype&(JT_
2f540 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
2f550 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20  =0)  /* (1) */. 
2f560 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
2f570 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f  mplement a co-ro
2f580 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2f590 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
2f5a0 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
2f5b0 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f  t.      ** set o
2f5c0 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
2f5d0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
2f5e0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20    int addrTop = 
2f5f0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2f600 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20  ntAddr(v)+1;.   
2f610 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e    .      pItem->
2f620 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
2f630 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2f640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f650 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
2f660 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
2f670 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64  regReturn, 0, ad
2f680 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  drTop);.      Vd
2f690 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
2f6a0 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
2f6b0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2f6c0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2f6d0 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
2f6e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2f6f0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
2f700 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
2f710 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2f720 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
2f730 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2f740 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
2f750 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
2f760 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
2f770 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
2f780 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
2f790 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2f7a0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2f7b0 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74   = pSub->nSelect
2f7c0 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  Row;.      pItem
2f7d0 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
2f7e0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74  e = 1;.      pIt
2f7f0 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20  em->regResult = 
2f800 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20  dest.iSdst;.    
2f810 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
2f820 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74  Coroutine(v, pIt
2f830 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2f840 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f850 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2f860 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73  rTop-1);.      s
2f870 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2f880 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
2f890 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f8a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2f8b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2f8c0 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
2f8d0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
2f8e0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  h.      ** the c
2f8f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73  ontent of this s
2f900 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d  ubquery.  pItem-
2f910 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c  >addrFillSub wil
2f920 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  l point.      **
2f930 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
2f940 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2f950 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49   subroutine.  pI
2f960 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20  tem->regReturn. 
2f970 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67       ** is a reg
2f980 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
2f990 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72  to hold the subr
2f9a0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64  outine return ad
2f9b0 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20  dress.      */. 
2f9c0 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72       int topAddr
2f9d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
2f9e0 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
2f9f0 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20  int retAddr;.   
2fa00 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2fa10 74 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a  t_item *pPrior;.
2fa20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2fa30 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2fa40 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49  b==0 );.      pI
2fa50 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
2fa60 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2fa70 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d  .      topAddr =
2fa80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fa90 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2faa0 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  , 0, pItem->regR
2fab0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49  eturn);.      pI
2fac0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2fad0 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20   = topAddr+1;.  
2fae0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
2faf0 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d  g.isCorrelated==
2fb00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2fb10 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
2fb20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65  is not correlate
2fb30 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20  d and if we are 
2fb40 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20  not inside of.  
2fb50 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
2fb60 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79  er, then we only
2fb70 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
2fb80 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2fb90 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20  e subquery.     
2fba0 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20     ** once. */. 
2fbb0 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20         onceAddr 
2fbc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2fbd0 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
2fbe0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2fbf0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2fc00 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
2fc10 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
2fc20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2fc30 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  me));.      }els
2fc40 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e  e{.        VdbeN
2fc50 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
2fc60 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
2fc70 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
2fc80 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2fc90 20 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20   }.      pPrior 
2fca0 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77  = isSelfJoinView
2fcb0 28 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d  (pTabList, pItem
2fcc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
2fcd0 69 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ior ){.        s
2fce0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2fcf0 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
2fd00 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  pItem->iCursor, 
2fd10 70 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29  pPrior->iCursor)
2fd20 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
2fd30 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
2fd40 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 70 50  m->iSelectId, pP
2fd50 72 69 6f 72 2d 3e 69 53 65 6c 65 63 74 49 64 29  rior->iSelectId)
2fd60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2fd70 28 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  ( pPrior->pSelec
2fd80 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
2fd90 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2fda0 20 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65   = pPrior->pSele
2fdb0 63 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ct->nSelectRow;.
2fdc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fdd0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2fde0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
2fdf0 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
2fe00 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
2fe10 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
2fe20 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2fe30 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
2fe40 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
2fe50 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20  lectId);.       
2fe60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
2fe70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
2fe80 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2fe90 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
2fea0 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
2feb0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
2fec0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
2fed0 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
2fee0 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
2fef0 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
2ff00 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2ff10 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2ff20 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
2ff30 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
2ff40 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2ff50 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
2ff60 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2ff70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ff80 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
2ff90 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
2ffa0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2ffb0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2ffc0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
2ffd0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2ffe0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2fff0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61  ect_end;.    pPa
30000 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
30010 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
30020 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20  rHeight(p);.    
30030 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
30040 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
30050 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66  hContext;.#endif
30060 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f  .  }..  /* Vario
30070 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  us elements of t
30080 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64  he SELECT copied
30090 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69   into local vari
300a0 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63  ables for.  ** c
300b0 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20  onvenience */.  
300c0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
300d0 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  st;.  pWhere = p
300e0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
300f0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
30100 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
30110 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
30120 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
30130 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
30140 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
30150 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
30160 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
30170 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
30180 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
30190 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
301a0 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
301b0 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  fter all FROM-cl
301c0 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  ause analysis:\n
301d0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
301e0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
301f0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
30200 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
30210 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
30220 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66  PTIMIZATION.  if
30230 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  ( OptimizationEn
30240 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
30250 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c  _QueryFlattener|
30260 53 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69  SQLITE_CountOfVi
30270 65 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f  ew).   && countO
30280 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f  fViewOptimizatio
30290 6e 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29  n(pParse, p).  )
302a0 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  {.    if( db->ma
302b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
302c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
302d0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
302e0 4c 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69  List;.    pTabLi
302f0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
30300 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
30310 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44  f the query is D
30320 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20  ISTINCT with an 
30330 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20  ORDER BY but is 
30340 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
30350 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74  , and .  ** if t
30360 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69  he select-list i
30370 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
30380 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c  e ORDER BY list,
30390 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79   then this query
303a0 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  .  ** can be rew
303b0 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55  ritten as a GROU
303c0 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77  P BY. In other w
303d0 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a  ords, this:.  **
303e0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
303f0 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52   DISTINCT xyz FR
30400 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  OM ... ORDER BY 
30410 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  xyz.  **.  ** is
30420 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a   transformed to:
30430 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
30440 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  ELECT xyz FROM .
30450 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20  .. GROUP BY xyz 
30460 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
30470 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  *.  ** The secon
30480 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72  d form is prefer
30490 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  red as a single 
304a0 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74  index (or temp-t
304b0 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20  able) may be .  
304c0 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  ** used for both
304d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e   the ORDER BY an
304e0 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  d DISTINCT proce
304f0 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e  ssing. As origin
30500 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74  ally .  ** writt
30510 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73  en the query mus
30520 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62  t use a temp-tab
30530 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  le for at least 
30540 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  one of the ORDER
30550 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49   .  ** BY and DI
30560 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69  STINCT, and an i
30570 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65  ndex or separate
30580 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
30590 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a  the other..  */.
305a0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
305b0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
305c0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
305d0 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20  ==SF_Distinct . 
305e0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
305f0 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72  ListCompare(sSor
30600 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69  t.pOrderBy, pELi
30610 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a  st, -1)==0.  ){.
30620 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
30630 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
30640 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
30650 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
30660 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
30670 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b  (db, pEList, 0);
30680 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74  .    /* Notice t
30690 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74  hat even thought
306a0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73   SF_Distinct has
306b0 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72   been cleared fr
306c0 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  om p->selFlags,.
306d0 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74      ** the sDist
306e0 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73  inct.isTnct is s
306f0 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65  till set.  Hence
30700 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65  , isTnct represe
30710 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nts the.    ** o
30720 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20  riginal setting 
30730 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e  of the SF_Distin
30740 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65  ct flag, not the
30750 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
30760 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
30770 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
30780 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54   );..#if SELECTT
30790 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
307a0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
307b0 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
307c0 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  ){.      SELECTT
307d0 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
307e0 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20  e,p,("Transform 
307f0 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52  DISTINCT into GR
30800 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20  OUP BY:\n"));.  
30810 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
30820 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
30830 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
30840 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
30850 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
30860 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
30870 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65  create an epheme
30880 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a  ral index to.  *
30890 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67  * do the sorting
308a0 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74  .  But this sort
308b0 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e  ing ephemeral in
308c0 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
308d0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73  .  ** being unus
308e0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
308f0 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20  an be extracted 
30900 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
30910 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61  der..  ** If tha
30920 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
30930 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  hen the OP_OpenE
30940 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
30950 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  tion will be.  *
30960 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  * changed to an 
30970 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20  OP_Noop once we 
30980 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
30990 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
309a0 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65  x is.  ** not ne
309b0 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74  eded.  The sSort
309c0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76  .addrSortIndex v
309d0 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
309e0 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20  to facilitate.  
309f0 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  ** that change..
30a00 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
30a10 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
30a20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
30a30 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  fo;.    pKeyInfo
30a40 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
30a50 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73  prList(pParse, s
30a60 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30  Sort.pOrderBy, 0
30a70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
30a80 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75  ;.    sSort.iECu
30a90 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
30aa0 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74  Tab++;.    sSort
30ab0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
30ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30ad0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
30ae0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
30af0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45          sSort.iE
30b00 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f  Cursor, sSort.pO
30b10 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b  rderBy->nExpr+1+
30b20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
30b30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61  ,.          (cha
30b40 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
30b50 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b  KEYINFO.      );
30b60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53  .  }else{.    sS
30b70 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
30b80 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
30b90 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
30ba0 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
30bb0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
30bc0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
30bd0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
30be0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
30bf0 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
30c00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30c10 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
30c20 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69  emeral, pDest->i
30c30 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  SDParm, pEList->
30c40 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
30c50 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
30c60 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
30c70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
30c80 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20  Label(v);.  if( 
30c90 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
30ca0 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30  F_FixedLimit)==0
30cb0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65   ){.    p->nSele
30cc0 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a  ctRow = 320;  /*
30cd0 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20   4 billion rows 
30ce0 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65  */.  }.  compute
30cf0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
30d00 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
30d10 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
30d20 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64  ==0 && sSort.add
30d30 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
30d40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
30d50 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20  ChangeOpcode(v, 
30d60 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
30d70 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  dex, OP_SorterOp
30d80 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73  en);.    sSort.s
30d90 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54  ortFlags |= SORT
30da0 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a  FLAG_UseSorter;.
30db0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
30dc0 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
30dd0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
30de0 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
30df0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
30e00 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
30e10 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
30e20 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
30e30 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
30e40 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
30e50 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
30e60 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
30e70 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
30e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e90 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73              sDis
30ea0 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30  tinct.tabTnct, 0
30eb0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
30ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ed0 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
30ee0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
30ef0 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30  rse, p->pEList,0
30f00 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,0),.           
30f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
30f30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
30f40 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
30f50 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
30f60 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
30f70 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
30f80 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a  INCT_UNORDERED;.
30f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69    }else{.    sDi
30fa0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
30fb0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
30fc0 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  T_NOOP;.  }..  i
30fd0 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
30fe0 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
30ff0 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20  /* No aggregate 
31000 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
31010 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
31020 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72   */.    u16 wctr
31030 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69  lFlags = (sDisti
31040 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45  nct.isTnct ? WHE
31050 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
31060 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
31070 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  t( WHERE_USE_LIM
31080 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69  IT==SF_FixedLimi
31090 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c  t );.    wctrlFl
310a0 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61  ags |= p->selFla
310b0 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
310c0 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69  it;..    /* Begi
310d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
310e0 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e  can. */.    pWIn
310f0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
31100 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
31110 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
31120 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
31130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31150 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c  p->pEList, wctrl
31160 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63  Flags, p->nSelec
31170 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  tRow);.    if( p
31180 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
31190 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
311a0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
311b0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
311c0 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
311d0 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
311e0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
311f0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
31200 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
31210 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
31220 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
31230 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
31240 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
31250 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
31260 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
31270 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
31280 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
31290 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
312a0 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
312b0 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
312c0 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
312d0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
312e0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53  WInfo);.      sS
312f0 6f 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65  ort.bOrderedInne
31300 72 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57  rLoop = sqlite3W
31310 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72  hereOrderedInner
31320 4c 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Loop(pWInfo);.  
31330 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f      if( sSort.nO
31340 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64  BSat==sSort.pOrd
31350 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
31360 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
31370 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
31380 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
31390 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
313a0 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
313b0 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
313c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
313d0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
313e0 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
313f0 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
31400 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
31410 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
31420 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
31430 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
31440 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72    if( sSort.addr
31450 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
31460 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d  sSort.pOrderBy==
31470 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
31480 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
31490 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
314a0 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
314b0 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
314c0 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
314d0 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73   loop. */.    as
314e0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d  sert( p->pEList=
314f0 3d 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  =pEList );.    s
31500 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
31510 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
31520 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
31530 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
31540 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31550 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
31560 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
31570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31580 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
31590 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
315a0 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  o));..    /* End
315b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
315c0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
315d0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
315e0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
315f0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
31600 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
31610 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
31620 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
31630 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
31640 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
31650 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
31660 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
31670 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
31680 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
31690 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
316a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
316b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
316c0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
316d0 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
316e0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
316f0 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
31700 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
31710 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
31720 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
31730 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
31740 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
31750 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
31760 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
31770 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
31780 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
31790 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
317a0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
317b0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
317c0 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
317d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317e0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
317f0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
31800 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
31810 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
31820 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
31830 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
31840 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
31850 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
31860 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
31870 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
31880 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
31890 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
318a0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
318b0 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
318c0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
318d0 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
318e0 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
318f0 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
31900 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
31910 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
31920 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
31930 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
31940 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
31950 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42  /.    int orderB
31960 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75  yGrp = 0; /* Tru
31970 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42  e if the GROUP B
31980 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61  Y and ORDER BY a
31990 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a  re the same */..
319a0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
319b0 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
319c0 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
319d0 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
319e0 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
319f0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
31a00 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
31a10 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
31a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a30 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
31a40 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
31a50 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
31a60 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
31a70 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
31a80 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
31a90 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
31aa0 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
31ab0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
31ac0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
31ad0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
31ae0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
31af0 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
31b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
31b10 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
31b20 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
31b30 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
31b40 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
31b50 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
31b60 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
31b70 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
31b80 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 66==sqlite3Log
31b90 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20  Est(100) );.    
31ba0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
31bb0 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c  Row>66 ) p->nSel
31bc0 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20  ectRow = 66;.   
31bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
31be0 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
31bf0 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20  LogEst(1) );.   
31c00 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
31c10 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
31c20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
31c30 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20  both a GROUP BY 
31c40 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20  and an ORDER BY 
31c50 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20  clause and they 
31c60 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74  are.    ** ident
31c70 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61  ical, then it ma
31c80 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  y be possible to
31c90 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44   disable the ORD
31ca0 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20  ER BY clause .  
31cb0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75    ** on the grou
31cc0 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f  nds that the GRO
31cd0 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65  UP BY will cause
31ce0 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d   elements to com
31cf0 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e  e out .    ** in
31d00 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
31d10 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20  er. It also may 
31d20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20  not - the GROUP 
31d30 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20  BY might use a. 
31d40 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
31d50 6e 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73  ndex that causes
31d60 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75   rows to be grou
31d70 70 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20  ped together as 
31d80 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20  required.    ** 
31d90 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  but not actually
31da0 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20   sorted. Either 
31db0 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20  way, record the 
31dc0 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20  fact that the.  
31dd0 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e    ** ORDER BY an
31de0 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  d GROUP BY claus
31df0 65 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  es are the same 
31e00 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f  by setting the o
31e10 72 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a  rderByGrp.    **
31e20 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20   variable.  */. 
31e30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
31e40 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47  prListCompare(pG
31e50 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f  roupBy, sSort.pO
31e60 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29  rderBy, -1)==0 )
31e70 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47  {.      orderByG
31e80 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a  rp = 1;.    }. .
31e90 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
31ea0 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
31eb0 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
31ec0 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79   abort the query
31ed0 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20   */.    addrEnd 
31ee0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
31ef0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
31f00 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
31f10 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
31f20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
31f30 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
31f40 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
31f50 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
31f60 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
31f70 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
31f80 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
31f90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
31fa0 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
31fb0 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
31fc0 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
31fd0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
31fe0 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
31ff0 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
32000 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
32010 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
32020 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d  sAggInfo.mnReg =
32030 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
32040 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
32050 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
32060 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
32070 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  By->nExpr : 0;. 
32080 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
32090 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
320a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
320b0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
320c0 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
320d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
320e0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
320f0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
32100 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  );.    if( pHavi
32110 6e 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ng ){.      if( 
32120 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
32130 20 20 20 20 61 73 73 65 72 74 28 20 70 57 68 65      assert( pWhe
32140 72 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b  re==p->pWhere );
32150 0a 20 20 20 20 20 20 20 20 68 61 76 69 6e 67 54  .        havingT
32160 6f 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 70  oWhere(pParse, p
32170 47 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67  GroupBy, pHaving
32180 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
32190 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20         pWhere = 
321a0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  p->pWhere;.     
321b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
321c0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
321d0 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
321e0 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
321f0 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
32200 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
32210 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  .nColumn;.    if
32220 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
32230 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d   && p->pHaving==
32240 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46  0 && sAggInfo.nF
32250 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unc==1 ){.      
32260 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e  minMaxFlag = min
32270 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41 67  MaxQuery(db, sAg
32280 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70  gInfo.aFunc[0].p
32290 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72  Expr, &pMinMaxOr
322a0 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73  derBy);.    }els
322b0 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  e{.      minMaxF
322c0 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  lag = WHERE_ORDE
322d0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  RBY_NORMAL;.    
322e0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
322f0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
32300 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
32310 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
32320 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
32330 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
32340 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
32350 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
32360 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
32370 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
32380 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
32390 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
323a0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
323b0 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
323c0 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
323d0 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
323e0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
323f0 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
32400 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
32410 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
32420 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
32430 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  end;.#if SELECTT
32440 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
32450 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
32460 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
32470 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
32480 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
32490 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
324a0 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65 67  p,("After aggreg
324b0 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  ate analysis:\n"
324c0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
324d0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
324e0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
324f0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
32500 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
32510 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
32520 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
32530 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d  ("agg-column[%d]
32540 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20   iMem=%d\n",.   
32550 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67           ii, sAg
32560 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69  gInfo.aCol[ii].i
32570 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
32580 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
32590 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  r(0, sAggInfo.aC
325a0 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  ol[ii].pExpr, 0)
325b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
325c0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
325d0 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b  gInfo.nFunc; ii+
325e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
325f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
32600 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69 4d  agg-func[%d]: iM
32610 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  em=%d\n",.      
32620 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e        ii, sAggIn
32630 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d 65  fo.aFunc[ii].iMe
32640 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
32650 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
32660 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  0, sAggInfo.aFun
32670 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b  c[ii].pExpr, 0);
32680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
32690 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20 50  endif...    /* P
326a0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
326b0 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
326c0 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
326d0 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
326e0 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
326f0 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
32700 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
32710 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
32720 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
32730 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
32740 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
32750 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
32760 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
32770 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
32780 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b        int addr1;
32790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
327a0 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
327b0 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
327c0 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
327d0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
327e0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
327f0 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
32800 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
32810 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
32820 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
32830 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
32840 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
32850 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
32860 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
32870 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
32880 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
32890 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
328a0 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
328b0 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
328c0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
328d0 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
328e0 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
328f0 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
32900 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
32910 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
32920 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
32930 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
32940 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
32950 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
32960 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
32970 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
32980 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
32990 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
329a0 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
329b0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
329c0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
329d0 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
329e0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
329f0 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
32a00 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
32a10 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
32a20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
32a30 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
32a40 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
32a50 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
32a60 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f  r all, the OP_So
32a70 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63  rterOpen instruc
32a80 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
32a90 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
32aa0 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
32ab0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
32ac0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
32ad0 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
32ae0 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
32af0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
32b00 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
32b10 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41   pGroupBy, 0, sA
32b20 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b  ggInfo.nColumn);
32b30 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
32b40 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
32b50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
32b60 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
32b70 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
32b80 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
32b90 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
32ba0 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
32bb0 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
32bc0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
32bd0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
32be0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
32bf0 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
32c00 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
32c10 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
32c20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
32c30 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
32c40 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
32c50 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
32c60 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
32c70 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
32c80 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
32c90 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
32ca0 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
32cb0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
32cc0 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
32cd0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
32ce0 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
32cf0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
32d00 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
32d10 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
32d20 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
32d30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
32d40 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
32d50 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
32d60 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
32d70 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
32d80 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
32d90 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
32da0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
32db0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
32dc0 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
32dd0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
32de0 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
32df0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
32e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32e10 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
32e20 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
32e30 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
32e40 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
32e50 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
32e60 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
32e70 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
32e80 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
32e90 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
32ea0 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
32eb0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
32ec0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
32ed0 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
32ee0 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
32ef0 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
32f00 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
32f10 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
32f20 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
32f30 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
32f40 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
32f50 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
32f60 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
32f70 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
32f80 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
32f90 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
32fa0 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
32fb0 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
32fc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
32fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
32fe0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
32ff0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
33000 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  t);.      pWInfo
33010 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
33020 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
33030 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
33040 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20  GroupBy, 0,.    
33050 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55        WHERE_GROU
33060 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72  PBY | (orderByGr
33070 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59  p ? WHERE_SORTBY
33080 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20  GROUP : 0), 0.  
33090 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
330a0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
330b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
330c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
330d0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
330e0 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d  Info)==pGroupBy-
330f0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
33100 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
33110 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
33120 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
33130 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
33140 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
33150 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
33160 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
33170 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
33180 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
33190 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
331a0 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
331b0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
331c0 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
331d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
331e0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
331f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33200 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
33210 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
33220 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
33230 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
33240 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
33250 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
33260 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
33270 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
33280 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
33290 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
332a0 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
332b0 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
332c0 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
332d0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
332e0 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
332f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
33300 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
33310 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
33320 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
33330 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
33340 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
33350 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
33360 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
33370 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e          (sDistin
33380 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d  ct.isTnct && (p-
33390 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
333a0 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20  tinct)==0) ?.   
333b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333c0 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47   "DISTINCT" : "G
333d0 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
333e0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
333f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
33400 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
33410 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
33420 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
33430 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
33440 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
33450 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
33460 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
33470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
33480 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
33490 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ].iSorterColumn>
334a0 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
334b0 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
334c0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
334d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
334e0 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
334f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
33500 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
33510 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
33520 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
33530 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
33540 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
33550 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
33560 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
33570 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20  egBase, 0, 0);. 
33580 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
33590 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
335a0 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
335b0 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
335c0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
335d0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
335e0 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
335f0 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
33600 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
33610 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
33620 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
33630 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65  r1 = j + regBase
33640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
33650 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
33660 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72  ColumnToReg(pPar
33670 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
33680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33690 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
336a0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
336b0 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29  Col->iTable, r1)
336c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
336d0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
336e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
336f0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
33700 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
33710 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
33720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33730 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
33740 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
33750 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
33760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33770 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
33780 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
33790 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
337a0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
337b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
337c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
337d0 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
337e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
337f0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
33800 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
33810 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
33820 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
33830 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
33840 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
33850 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
33860 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
33870 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
33880 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
33890 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
338a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
338b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
338c0 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
338d0 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
338e0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
338f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33900 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
33910 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
33920 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
33930 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
33940 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
33950 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56  UP BY sort")); V
33960 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
33970 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
33980 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
33990 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
339a0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
339b0 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  r(pParse);..    
339c0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
339d0 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65   the index or te
339e0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73  mporary table us
339f0 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20  ed by the GROUP 
33a00 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a  BY sort.      **
33a10 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20   will naturally 
33a20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
33a30 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72  the order requir
33a40 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20  ed by the ORDER 
33a50 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  BY.      ** clau
33a60 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65  se, cancel the e
33a70 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f  phemeral table o
33a80 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65  pen coded earlie
33a90 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
33aa0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20    ** This is an 
33ab0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
33ac0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
33ad0 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
33ae0 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
33af0 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c    ** Use the SQL
33b00 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
33b10 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54   flag with SQLIT
33b20 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
33b30 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a  IZER to .      *
33b40 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f  * disable this o
33b50 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
33b60 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
33b70 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
33b80 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70  orderByGrp && Op
33b90 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
33ba0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f  d(db, SQLITE_Gro
33bb0 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20  upByOrder) .    
33bc0 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f     && (groupBySo
33bd0 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65  rt || sqlite3Whe
33be0 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66  reIsSorted(pWInf
33bf0 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  o)).      ){.   
33c00 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
33c10 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
33c20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
33c30 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
33c40 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
33c50 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
33c60 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
33c70 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
33c80 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
33c90 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
33ca0 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
33cb0 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
33cc0 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
33cd0 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
33ce0 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
33cf0 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
33d00 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
33d10 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
33d20 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
33d30 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
33d40 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
33d50 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
33d60 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
33d70 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
33d80 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
33d90 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
33da0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
33db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
33dc0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
33dd0 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  se);.      if( g
33de0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
33df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33e00 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
33e10 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e  rterData, sAggIn
33e20 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  fo.sortingIdx,. 
33e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e40 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74           sortOut
33e50 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20  , sortPTab);.   
33e60 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
33e70 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
33e80 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
33e90 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
33ea0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
33eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33ec0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
33ed0 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
33ee0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
33ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33f00 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
33f10 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
33f20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
33f30 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
33f40 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
33f50 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
33f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33f70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33f80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
33f90 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
33fa0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
33fb0 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
33fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
33fd0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
33fe0 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
33ff0 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
34000 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
34010 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
34020 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
34030 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
34040 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
34050 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31  r1+1, 0, addr1+1
34060 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
34070 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  v);..      /* Ge
34080 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
34090 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
340a0 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
340b0 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
340c0 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
340d0 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
340e0 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
340f0 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
34100 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
34110 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
34120 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
34130 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
34140 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
34150 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
34160 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
34170 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
34180 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
34190 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
341a0 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
341b0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
341c0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
341d0 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
341e0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
341f0 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
34200 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
34210 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
34220 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
34230 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34240 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
34250 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
34260 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
34270 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
34280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34290 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
342a0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
342b0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
342c0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
342d0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
342e0 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
342f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
34300 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
34310 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
34320 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
34330 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
34340 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
34350 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
34360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34370 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
34380 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
34390 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
343a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
343b0 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
343c0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
343d0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
343e0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
343f0 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
34400 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
34410 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
34420 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
34430 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34440 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
34450 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  1);.      update
34460 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
34470 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
34480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34490 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
344a0 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
344b0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
344c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
344d0 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
344e0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
344f0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
34500 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
34510 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
34520 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
34530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34540 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
34550 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
34560 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
34570 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
34580 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
34590 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
345a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
345b0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
345c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
345d0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
345e0 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
345f0 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  dx);.      }..  
34600 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68      /* Output th
34610 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72  e final row of r
34620 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esult.      */. 
34630 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34640 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
34650 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
34660 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
34670 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
34680 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
34690 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20  final row"));.. 
346a0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65       /* Jump ove
346b0 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  r the subroutine
346c0 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
346d0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
346e0 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20  (v, addrEnd);.. 
346f0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
34700 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
34710 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
34720 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
34730 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
34740 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
34750 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
34760 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
34770 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
34780 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
34790 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
347a0 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
347b0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
347c0 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
347d0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
347e0 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
347f0 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
34800 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
34810 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
34820 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
34830 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
34840 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
34850 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
34860 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
34870 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
34880 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34890 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
348a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
348b0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
348c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
348d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
348e0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
348f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
34900 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
34910 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
34920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34930 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
34940 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
34950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34960 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
34970 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
34980 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
34990 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
349a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
349b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
349c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
349d0 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
349e0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
349f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
34a00 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
34a10 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
34a20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
34a30 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
34a40 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
34a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34a60 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
34a70 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
34a80 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
34a90 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
34aa0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
34ab0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
34ac0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
34ad0 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
34ae0 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
34af0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
34b00 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
34b10 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
34b20 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20  , &sSort,.      
34b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b40 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
34b50 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
34b60 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
34b70 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
34b80 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
34b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
34ba0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
34bb0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
34bc0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
34bd0 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
34be0 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
34bf0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
34c00 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
34c10 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
34c20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
34c30 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
34c40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
34c50 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
34c60 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
34c70 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
34c80 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
34c90 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
34ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34cb0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
34cc0 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
34cd0 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
34ce0 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
34cf0 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
34d00 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
34d10 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
34d20 20 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65 66    else {.#ifndef
34d30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
34d40 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61  EECOUNT.      Ta
34d50 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
34d60 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53   if( (pTab = isS
34d70 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73  impleCount(p, &s
34d80 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a  AggInfo))!=0 ){.
34d90 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
34da0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65  SimpleCount() re
34db0 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
34dc0 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
34dd0 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  ture, then.     
34de0 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74     ** the SQL st
34df0 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
34e00 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20  e form:.        
34e10 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
34e20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
34e30 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20  FROM <tbl>.     
34e40 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
34e50 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65   where the Table
34e60 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
34e70 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74  ned represents t
34e80 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20  able <tbl>..    
34e90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
34ea0 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
34eb0 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68   is so common th
34ec0 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a  at it is optimiz
34ed0 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68  ed specially. Th
34ee0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f  e.        ** OP_
34ef0 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  Count instructio
34f00 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69  n is executed ei
34f10 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b  ther on the intk
34f20 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  ey table that.  
34f30 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
34f40 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  s the data for t
34f50 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e  able <tbl> or on
34f60 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65   one of its inde
34f70 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20  xes. It.        
34f80 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  ** is better to 
34f90 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f  execute the op o
34fa0 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69  n an index, as i
34fb0 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73  ndexes are almos
34fc0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  t.        ** alw
34fd0 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73  ays spread acros
34fe0 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  s less pages tha
34ff0 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
35000 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20  nding tables..  
35010 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
35020 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d   const int iDb =
35030 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
35040 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
35050 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
35060 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
35070 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73  int iCsr = pPars
35080 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
35090 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
350a0 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
350b0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
350c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350d0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
350e0 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
350f0 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
35100 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
35110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35120 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e  Keyinfo for scan
35130 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ned index */.   
35140 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73       Index *pBes
35150 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
35160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
35170 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f  t index found so
35180 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
35190 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62  int iRoot = pTab
351a0 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  ->tnum;         
351b0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
351c0 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74  e of scanned b-t
351d0 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ree */..        
351e0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
351f0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
35200 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
35210 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
35220 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
35230 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
35240 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  >zName);..      
35250 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
35260 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68  the index that h
35270 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63  as the lowest sc
35280 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20  an cost..       
35290 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
352a0 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
352b0 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
352c0 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
352d0 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
352e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
352f0 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e  2013-10-03) Do n
35300 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74  ot count the ent
35310 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61  ries in a partia
35320 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  l index..       
35330 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
35340 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
35350 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
35360 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
35370 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
35380 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
35390 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
353a0 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
353b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
353c0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
353d0 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c  b) ) pBest = sql
353e0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
353f0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
35400 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
35410 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
35420 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
35430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
35440 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
35450 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
35460 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  && pIdx->szIdxRo
35470 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
35480 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
35490 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
354a0 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  re==0.          
354b0 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
354c0 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42  Idx->szIdxRow<pB
354d0 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20  est->szIdxRow). 
354e0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
354f0 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
35500 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
35510 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35520 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
35530 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
35540 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
35550 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
35560 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
35570 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
35580 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
35590 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
355a0 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
355b0 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
355c0 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
355d0 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
355e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
355f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
35600 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  t(v, OP_OpenRead
35610 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
35620 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Db, 1);.        
35630 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
35640 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35650 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
35660 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
35670 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
35680 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  O);.        }.  
35690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
356a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
356b0 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
356c0 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
356d0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
356e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
356f0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
35700 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
35710 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
35720 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
35730 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
35740 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
35750 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
35760 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
35770 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
35780 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
35790 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
357a0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
357b0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
357c0 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
357d0 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
357e0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
357f0 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
35800 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
35810 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
35820 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
35830 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
35840 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
35850 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
35860 41 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 20  AggInfo);..     
35870 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 71 75     /* If this qu
35880 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
35890 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
358a0 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
358b0 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
358c0 20 6d 69 6e 4d 61 78 46 6c 61 67 20 77 69 6c 6c   minMaxFlag will
358d0 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76 69   have been previ
358e0 6f 75 73 6c 79 20 73 65 74 20 74 6f 20 65 69 74  ously set to eit
358f0 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  her.        ** W
35900 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
35910 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
35920 59 5f 4d 41 58 20 61 6e 64 20 70 4d 69 6e 4d 61  Y_MAX and pMinMa
35930 78 4f 72 64 65 72 42 79 20 77 69 6c 6c 0a 20 20  xOrderBy will.  
35940 20 20 20 20 20 20 2a 2a 20 62 65 20 61 6e 20 61        ** be an a
35950 70 70 72 6f 70 72 69 61 74 65 20 4f 52 44 45 52  ppropriate ORDER
35960 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 66   BY expression f
35970 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  or the optimizat
35980 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
35990 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
359a0 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45 52  minMaxFlag==WHER
359b0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
359c0 20 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72   || pMinMaxOrder
359d0 42 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By!=0 );.       
359e0 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
359f0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 4d  OrderBy==0 || pM
35a00 69 6e 4d 61 78 4f 72 64 65 72 42 79 2d 3e 6e 45  inMaxOrderBy->nE
35a10 78 70 72 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  xpr==1 );..     
35a20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
35a30 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
35a40 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
35a50 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 4f  pWhere, pMinMaxO
35a60 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
35a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a80 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 6d 69             0, mi
35a90 6e 4d 61 78 46 6c 61 67 2c 20 30 29 3b 0a 20 20  nMaxFlag, 0);.  
35aa0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
35ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
35ac0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
35ad0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35ae0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
35af0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
35b00 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
35b10 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
35b20 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
35b30 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  fo)>0 ){.       
35b40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
35b50 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57 68 65  to(v, sqlite3Whe
35b60 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
35b70 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20  nfo));.         
35b80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
35b90 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22   "%s() by index"
35ba0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35bb0 20 20 28 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57    (minMaxFlag==W
35bc0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
35bd0 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
35be0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35bf0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
35c00 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
35c10 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
35c20 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
35c30 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
35c40 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72     }..      sSor
35c50 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
35c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
35c70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
35c80 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
35c90 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
35ca0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
35cb0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
35cc0 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30  rse, p, -1, 0, 0
35cd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
35ce0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20           pDest, 
35cf0 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
35d00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
35d10 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
35d20 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29  abel(v, addrEnd)
35d30 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e  ;.    .  } /* en
35d40 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75  dif aggregate qu
35d50 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44  ery */..  if( sD
35d60 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
35d70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
35d80 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20  T_UNORDERED ){. 
35d90 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
35da0 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49 53  ble(pParse, "DIS
35db0 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20  TINCT");.  }..  
35dc0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
35dd0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
35de0 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
35df0 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
35e00 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
35e10 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
35e20 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
35e30 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53  e..  */.  if( sS
35e40 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
35e50 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
35e60 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20 20  able(pParse,.   
35e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e80 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30    sSort.nOBSat>0
35e90 20 3f 20 22 52 49 47 48 54 20 50 41 52 54 20 4f   ? "RIGHT PART O
35ea0 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44  F ORDER BY":"ORD
35eb0 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e  ER BY");.    gen
35ec0 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
35ed0 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c  arse, p, &sSort,
35ee0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
35ef0 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
35f00 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
35f10 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
35f20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
35f30 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
35f40 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
35f50 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
35f60 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65 72  n coded. If ther
35f70 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  e is an error in
35f80 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63   the Parse struc
35f90 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74  ture,.  ** set t
35fa0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
35fb0 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 30  o 1. Otherwise 0
35fc0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50 61  . */.  rc = (pPa
35fd0 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20  rse->nErr>0);.. 
35fe0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
35ff0 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
36000 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
36010 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
36020 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
36030 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
36040 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
36050 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70  elect_end:.  exp
36060 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
36070 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
36080 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
36090 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  Id);.  sqlite3Ex
360a0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
360b0 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 29   pMinMaxOrderBy)
360c0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
360d0 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
360e0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Col);.  sqlite3D
360f0 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
36100 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53  fo.aFunc);.#if S
36110 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
36120 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  ED.  SELECTTRACE
36130 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
36140 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  d processing\n")
36150 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  );.  pParse->nSe
36160 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65  lectIndent--;.#e
36170 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
36180 3b 0a 7d 0a                                      ;.}.